Ensamblador 80x86 sobre linux

Esta fue una pregunta sobre unix en modo grafico 1024x768 una whipala.

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