Ensamblador 80x86 sobre linux

martes, 17 de julio de 2012

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

0 comentarios :