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
El error se produce al ejecutar el codigo que ensamblaste. ¿No? Ensamblalo con informacion de depuracion y depuralo con gdb asi vas a ver donde falla, la pila, variables locales, etc..
bueno, recién empiezo en asm, pero hasta donde me dan mis conocimientos sobre registros, es que los segmentos las instrucciones las lee de izq a derecha, y la pila de derecha a izq a derecha, y en el medio los datos, cuando los valores de la pila se sobre pasan y empiezan a ocupar lugar de los datos en la memoria, te da el error de violación de segmento.
si me equivoco corrijan me