Error en programa en Ensamblador

(1/1)

michellcrh:
Hola, estoy haciendo este programa en ensamblador para métodos de ordenamiento. Pero después de mostrar el menú me muestra el error de Violaciòn de segmento ('core' generado)
Me podrìan ayudar a saber en dónde está el error por favor?

Código
section .data
 msg1 db "Ingrese 5 números presionando [Enter] entre cada uno de ellos" , 10
 len1 equ $-msg1
 
 msg2 db "***MÉTODOS DE ORDENAMIENTO DISPONIBLES***", 10
 len2 equ $-msg2
 
 msg3 db "1. INSERTION SORT", 10
 len3 equ $-msg3
 
 msg4 db "2. SELECTION SORT", 10
 len4 equ $-msg4
 
 msg5 db "3. BUBBLE SORT", 10
 len5 equ $-msg5
 
 msg6 db "Ingrese el número correspondiente al método de ordenamiento deseado:", 10
 len6 equ $-msg6
 
 msg7 db 0xA
 len7 equ $-msg7
 
 array db 0,0,0,0,0
 la equ $-array
 
section .bss
 res resb 10
 
 
section .text
 global _start
 
   _start:
 
      ;Mostrar mensaje 1
      mov eax,4
      mov ebx,1
      mov ecx, msg1
      mov edx, len1
      int 0x80
 
      mov esi, array
      mov edi, 0
 
      call lee
 
 
      ;SALTO DE LÍNEA
      mov eax, 4
      mov ebx, 1
      mov ecx, msg7
      mov edx, len7
      int 0x80
 
      jmp menu
 
      jmp end
 
 
 
 
   ;--------------------------------------------------------------
   lee:
push ebp
mov ebp, esp
 
;Almacenamos los 5 números
    num:
mov eax, 3
mov ebx, 0
mov ecx, res
mov edx, 10
int 0x80
 
mov esi, res
call atoi
mov [res], eax
 
mov al, [res]
 
mov [esi], al
inc edi
inc esi
cmp edi, la
jb num
 
pop ebp
ret
 
   ;----------------------------------------------------------------
   menu:
      ;MOSTRANDO MENÚ
      ;Mostrar mensaje 2
      mov eax,4
      mov ebx,1
      mov ecx, msg2
      mov edx, len2
      int 0x80
 
      ;SALTO DE LÍNEA
      mov eax, 4
      mov ebx, 1
      mov ecx, msg7
      mov edx, len7
      int 0x80
 
      ;Mostrar mensaje 3
      mov eax,4
      mov ebx,1
      mov ecx, msg3
      mov edx, len3
      int 0x80
 
      ;Mostrar mensaje 4
      mov eax,4
      mov ebx,1
      mov ecx, msg4
      mov edx, len4
      int 0x80
 
      ;Mostrar mensaje 5
      mov eax,4
      mov ebx,1
      mov ecx, msg5
      mov edx, len5
      int 0x80
 
      ;SALTO DE LÍNEA
      mov eax, 4
      mov ebx, 1
      mov ecx, msg7
      mov edx, len7
      int 0x80
 
      ;Mostrar mensaje 6
      mov eax,4
      mov ebx,1
      mov ecx, msg6
      mov edx, len6
      int 0x80
 
      ;SALTO DE LÍNEA
      mov eax, 4
      mov ebx, 1
      mov ecx, msg7
      mov edx, len7
      int 0x80
   ;--------------------------------------------------------------------------------------  
   atoi:
       push ebp
       mov ebp, esp
       xor eax, eax
   .top:
       movzx ecx, byte [esi] ; obtener un caracter
       inc esi ; leer la siguiente dirección
       cmp ecx, '0' ; digito valido?
       jb .done
       cmp ecx, '9'
       ja .done
       sub ecx, '0' ; "convertir" caracter a numero
       imul eax, eax, 10 ; multiplicar el resultado obtenido por 10
       add eax, ecx ; sumatoria
       jmp .top ; until done
       .done:
       pop ebp
       ret
 
   ;------------------------------------------------------------------
 
   end:
      ;FINAL DEL PROGRAMA
      mov eax, 1
      xor ebx, ebx
      int 0x80

xv0:
Hola

Depura el programa con gdb o cualquier otra herramienta, para saber donde esta la violacion de segmento. Aunque diria que en la linea 154-155.

Tendrias que hacer la comparacion antes de incrementar el puntero de %esi. Ya que me has dado a entender de que puedes ingresar los numeros no?

Por otra parte, por que no haces una funcion imprimir mensaje? y no tener tanto codigo?

Por que no tomas los numeros por argv?

Saludos.

Navegación

[0] Índice de Mensajes