intento hacer una calculadora en lenguaje ensamblador pero al compilar me aparece violacion de segmento lo q revisado y no encuentro el error espero me puedan ayudar
.section .data
mensaje: .asciz "calculadora\n"
menu: .asciz "suma[1]\n"
menu2: .asciz "resta[2]\n"
menu3: .asciz "multiplicacion[3]\n"
menu4: .asciz "division[4]\n"
escoge: .asciz "Escoja una operacion, introduzca el numero:\t"
error: .asciz "la opcion no existe\n"
valores: .asciz "introduzca los valores:\n"
cad1: .asciz "valor de A:\t"
cad2: .asciz "valor de B:\t"
cad3: .asciz "el resultado es:%d\n"
formato: .asciz "%d"
result: .int 0
.section .bss
opc: .space 4
valA: .space 4
valB: .space 4
.section .text
.globl main
funcion_suma: addl %eax, %ebx
ret
funcion_resta: subl %eax, %ebx
ret
funcion_multi: imull %ebx
ret
funcion_division: idivl %ebx
ret
main:
mensaje1: pushl $mensaje
call printf
menu_1: pushl $menu
call printf
menu_2: pushl $menu2
call printf
menu_3: pushl $menu3
call printf
menu_4: pushl $menu4
call printf
pushl $escoge
call printf
addl $24, %esp
pushl opc
call scanf
addl $4, %esp
movl opc,%eax
movl (opc),%ebx
subl %ebx, '0'
elige: cmpl $1,%ebx
je suma
cmpl $2,%ebx
je resta
cmpl $3,%ebx
je multiplicacion
cmpl $4,%ebx
je divi
cad_1: pushl $cad1 # lee valor 1
call printf
pushl valA
call scanf
addl $8, %esp
cad_2: pushl $cad2 # lee valor 2
call printf
pushl valB
call scanf
addl $8, %esp
suma: movl valA,%eax
movl valB,%ebx
call funcion_suma
movl %ebx,result
resta: movl valA,%eax
movl valB,%ebx
call funcion_resta
movl %ebx,result
multiplicacion: movl valA,%eax
movl valB,%ebx
call funcion_multi
movl %ebx,result
divi:
movl valA,%eax
cdq
movl valB,%ebx
call funcion_division
movl %ebx,result
resultado: pushl $cad3
call printf
pushl result
call printf
addl $8, %esp
call exit
.section .data
mensaje: .asciz "calculadora\n"
menu: .asciz "suma[1]\n"
menu2: .asciz "resta[2]\n"
menu3: .asciz "multiplicacion[3]\n"
menu4: .asciz "division[4]\n"
escoge: .asciz "Escoja una operacion, introduzca el numero:\t"
error: .asciz "la opcion no existe\n"
valores: .asciz "introduzca los valores:\n"
cad1: .asciz "valor de A:\t"
cad2: .asciz "valor de B:\t"
cad3: .asciz "el resultado es:%d\n"
formato: .asciz "%d"
result: .int 0
.section .bss
opc: .space 4
valA: .space 4
valB: .space 4
.section .text
.globl main
funcion_suma: addl %eax, %ebx
ret
funcion_resta: subl %eax, %ebx
ret
funcion_multi: imull %ebx
ret
funcion_division: idivl %ebx
ret
main:
mensaje1: pushl $mensaje
call printf
menu_1: pushl $menu
call printf
menu_2: pushl $menu2
call printf
menu_3: pushl $menu3
call printf
menu_4: pushl $menu4
call printf
pushl $escoge
call printf
addl $24, %esp
pushl opc
call scanf
addl $4, %esp
movl opc,%eax
movl (opc),%ebx
subl %ebx, '0'
elige: cmpl $1,%ebx
je suma
cmpl $2,%ebx
je resta
cmpl $3,%ebx
je multiplicacion
cmpl $4,%ebx
je divi
cad_1: pushl $cad1 # lee valor 1
call printf
pushl valA
call scanf
addl $8, %esp
cad_2: pushl $cad2 # lee valor 2
call printf
pushl valB
call scanf
addl $8, %esp
suma: movl valA,%eax
movl valB,%ebx
call funcion_suma
movl %ebx,result
resta: movl valA,%eax
movl valB,%ebx
call funcion_resta
movl %ebx,result
multiplicacion: movl valA,%eax
movl valB,%ebx
call funcion_multi
movl %ebx,result
divi:
movl valA,%eax
cdq
movl valB,%ebx
call funcion_division
movl %ebx,result
resultado: pushl $cad3
call printf
pushl result
call printf
addl $8, %esp
call exit