calculadora en lenguaje ensamblador ¨violacion de segmento¨

Iniciado por larapam, 6 Mayo 2012, 09:50 AM

0 Miembros y 1 Visitante están viendo este tema.

larapam

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

Eternal Idol

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..
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

CasiqueCasimiro

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