GAS (Gnu ASsembler) utiliza la sintaxis de AT&T, que tiene pequeñas diferencias con respecto a la sintaxis estándar de Intel (usada en NASM, TASM, MASM, etc).
debemos recordar que para :
# Compilar:
# as --gstabs -o whipala.o whipala.s
# Enlazar:
# ld -dynamic-linker /lib/ld-linux.so.2 -o whipala -lc whipala.o -lvga
Bueno presento a continuacion, el programa en ensamblador que dibujara la whipala sobre linux utilizando la sintaxis AT & T.
#--------------------------------------------------DATOS
.section .data
modvi: .int 12 # G1024x768x256
modtex: .int 0 # TEXT
ancho: .int 80 #ancho de cada cuadrito
alto: .int 50 #alto de cada cuadrito
x: .int 0
y: .int 0
contay: .int 0
count: .int 0
finx: .int 0
finy: .int 0
color: .int 0
gy: .int 0
ncol: .int 0
pabucle: .int 0
colores: .int 2 #verde
.int 1 #azul
.int 35 #violeta
.int 41 #rojo
.int 43 #naranja
.int 45 #amarillo
.int 77 #
#-----------------------------------------------------
.section .text
.globl _start
#====================================================
# PROGRAMA PRINCIPAL
#====================================================
_start:
call vga_init
pushl modvi
call vga_setmode # cambia a modo grafico
addl $4,%esp
movl $20,%eax #posini de y=20
movl %eax,y
movl %eax,gy
# trazamos blancos
movl $15,color #blancos
movl $7,ncol
call trazador
# trazamos otros colores
movl $colores,%esi
movl (%esi),%eax
movl %eax,color
bucg:
decl ncol
movl gy,%eax
addl alto,%eax
movl %eax,y
movl %eax,gy
call trazador
movl %esi,%eax
addl $4,%eax
movl %eax,%esi
movl (%esi),%eax
movl %eax,color
cmpl $77,%eax
jne bucg
# espera tecla para finalizar
call vga_getch
pushl modtex
call vga_setmode
addl $4,%esp
pushl $0 # termina programa
call exit
addl $4,%esp
#====================================================
# SUB RUTINAS
#====================================================
.type cuadrado, @function
cuadrado:
movl x,%eax
movl ancho,%ebx
addl %eax,%ebx
movl %ebx,finx
movl y,%eax
movl %eax,contay
movl alto,%ebx
addl %eax,%ebx
movl %ebx,finy
pushl color
call vga_setcolor # pone color
addl $4,%esp
bucle:
pushl contay # y2
pushl finx # x2
pushl contay # y1
pushl x # x1
call vga_drawline # Dibuja una linea
addl $16,%esp
incl contay
movl contay,%eax
cmpl finy,%eax
jne bucle
ret
#====================================================
.type trazador, @function
trazador:
movl $10,x
movl $0,count
ferb1:
call cuadrado
movl x,%eax
addl ancho,%eax
movl %eax,x
movl y,%eax
addl alto,%eax
movl %eax,y
incl count
movl count,%eax
cmpl ncol,%eax #
jne ferb1
movl $20,y
movl count,%eax
cmpl $7,%eax #
je finias
ferb2:
call cuadrado
movl x,%eax
addl ancho,%eax
movl %eax,x
movl y,%eax
addl alto,%eax
movl %eax,y
incl count
movl count,%eax
cmpl $7,%eax
jne ferb2
finias:
ret