Foro de elhacker.net

Programación => ASM => Mensaje iniciado por: larapam en 6 Mayo 2012, 09:50 am



Título: calculadora en lenguaje ensamblador ¨violacion de segmento¨
Publicado por: larapam en 6 Mayo 2012, 09:50 am
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


Título: Re: calculadora en lenguaje ensamblador ¨violacion de segmento¨
Publicado por: Eternal Idol en 6 Mayo 2012, 19:32 pm
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..


Título: Re: calculadora en lenguaje ensamblador ¨violacion de segmento¨
Publicado por: CasiqueCasimiro en 12 Mayo 2012, 18:58 pm
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