lunes, 17 de diciembre de 2018

Gas(GNU) Assembler


El gas, o GNU Assembler, es el ensamblador del proyecto GNU. Es el back end por defecto del GNU Compiler Collection y es usado para compilar Linux y otros sistemas operativos como el sistema operativo GNU
El gas puede ejecutar como también generar ensamblados para un número diferente de arquitecturas. Inicialmente utilizaba únicamente la sintaxis de AT&T en lugar de la sintaxis de Intel usada en muchos otros ensambladores, sin embargo, las últimas versiones soportan dicha sintaxis.

Ejemplo calculadora de dos números(suma, resta, multiplicación y división).

.def ___main; .scl 2; .type 32; .endef
.section .rdata,"dr"
LC2:
.ascii "Ingrese numero uno\0"
LC3:
.ascii "%f\0"
LC4:
.ascii "Ingrese numero dos \0"
LC5:
.ascii "cls\0"
.align 4
LC6:
.ascii "1.- Para sumar los dos numeros \0"
.align 4
LC7:
.ascii "2.- Para restar los dos numeros \0"
.align 4
LC8:
.ascii "3.- Para multiplicar los dos numeros \0"
.align 4
LC9:
.ascii "4.- Para dividir los dos numeros \0"
LC10:
.ascii "5.- salir\0"
LC11:
.ascii "%d\0"
LC12:
.ascii "La suma es: %f\0"
LC13:
.ascii "La resta es: %f\0"
LC14:
.ascii "La multiplicacion  es: %f\0"
LC15:
.ascii "La division es: %f\0"
LC16:
.ascii "Opcion no valida \0"
.text
.globl _main
.def _main; .scl 2; .type 32; .endef
_main:
pushl %ebp
movl %esp, %ebp
andl $-16, %esp
subl $48, %esp
call ___main
movl $0x00000000, %eax
movl %eax, 36(%esp)
movl $0x00000000, %eax
movl %eax, 32(%esp)
movl $0, 28(%esp)
movl $0, %eax
movl $0, %edx
movl %eax, 40(%esp)
movl %edx, 44(%esp)
movl $LC2, (%esp)
call _puts
leal 36(%esp), %eax
movl %eax, 4(%esp)
movl $LC3, (%esp)
call _scanf
movl $LC4, (%esp)
call _puts
leal 32(%esp), %eax
movl %eax, 4(%esp)
movl $LC3, (%esp)
call _scanf
L10:
movl $LC5, (%esp)
call _system
movl $LC6, (%esp)
call _puts
movl $LC7, (%esp)
call _puts
movl $LC8, (%esp)
call _puts
movl $LC9, (%esp)
call _puts
movl $LC10, (%esp)
call _puts
leal 28(%esp), %eax
movl %eax, 4(%esp)
movl $LC11, (%esp)
call _scanf
movl 28(%esp), %eax
cmpl $5, %eax
ja L2
movl L8(,%eax,4), %eax
jmp *%eax
.section .rdata,"dr"
.align 4
L8:
.long L2
.long L3
.long L4
.long L5
.long L6
.long L7
.text
L3:
movl 32(%esp), %edx
movl 36(%esp), %eax
movl %edx, 4(%esp)
movl %eax, (%esp)
call _suma
fstpl 40(%esp)
movl 40(%esp), %eax
movl 44(%esp), %edx
movl %eax, 4(%esp)
movl %edx, 8(%esp)
movl $LC12, (%esp)
call _printf
call _getch
jmp L9
L4:
movl 32(%esp), %edx
movl 36(%esp), %eax
movl %edx, 4(%esp)
movl %eax, (%esp)
call _resta
fstpl 40(%esp)
movl 40(%esp), %eax
movl 44(%esp), %edx
movl %eax, 4(%esp)
movl %edx, 8(%esp)
movl $LC13, (%esp)
call _printf
call _getch
jmp L9
L5:
movl 32(%esp), %edx
movl 36(%esp), %eax
movl %edx, 4(%esp)
movl %eax, (%esp)
call _multiplicacion
fstpl 40(%esp)
movl 40(%esp), %eax
movl 44(%esp), %edx
movl %eax, 4(%esp)
movl %edx, 8(%esp)
movl $LC14, (%esp)
call _printf
call _getch
jmp L9
L6:
movl 32(%esp), %edx
movl 36(%esp), %eax
movl %edx, 4(%esp)
movl %eax, (%esp)
call _division
fstpl 40(%esp)
movl 40(%esp), %eax
movl 44(%esp), %edx
movl %eax, 4(%esp)
movl %edx, 8(%esp)
movl $LC15, (%esp)
call _printf
call _getch
jmp L9
L7:
movl $1, (%esp)
call _exit
L2:
movl $LC16, (%esp)
call _puts
L9:
movl 28(%esp), %eax
cmpl $5, %eax
jne L10
movl $0, %eax
leave
ret
.globl _suma
.def _suma; .scl 2; .type 32; .endef
_suma:
pushl %ebp
movl %esp, %ebp
flds 8(%ebp)
fadds 12(%ebp)
popl %ebp
ret
.globl _resta
.def _resta; .scl 2; .type 32; .endef
_resta:
pushl %ebp
movl %esp, %ebp
flds 8(%ebp)
fsubs 12(%ebp)
popl %ebp
ret
.globl _multiplicacion
.def _multiplicacion; .scl 2; .type 32; .endef
_multiplicacion:
pushl %ebp
movl %esp, %ebp
flds 8(%ebp)
fmuls 12(%ebp)
popl %ebp
ret
.globl _division
.def _division; .scl 2; .type 32; .endef
_division:
pushl %ebp
movl %esp, %ebp
flds 8(%ebp)
fdivs 12(%ebp)
popl %ebp
ret
.def _puts; .scl 2; .type 32; .endef
.def _scanf; .scl 2; .type 32; .endef
.def _system; .scl 2; .type 32; .endef
.def _printf; .scl 2; .type 32; .endef
.def _getch; .scl 2; .type 32; .endef
.def _exit; .scl 2; .type 32; .endef




A continuación para compilarlo usar:
gcc -o calculadora -m32 calcauladora.s

Generara un ejecutable windows .exe y a continuación ingresar dos números y proceder con las operaciones.



Referencias:
https://es.wikipedia.org/wiki/GNU_Assembler
GAS Manual



No hay comentarios: