Violación de Segmento (Se ha volcado la memoria)
Publicado por Ferran (2 intervenciones) el 13/08/2020 17:06:08
Estoy aprendiendo a programar en código ensamblador de GNU/Linux, en AMD, con Nasm y sintáxis Intel 386
Este programa trata de buscar un determinado elemento de una lista normal de 12 elementos dividida virtualmente en una matriz 4x3. El formato secuencial es
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12
Pero virtualmente se dimensiona así
Linea 0 : 1,2,3,4
Linea 1: 5,6,7,8
Linea 2: 9,10,11,12
Como buscamos el 2,0 como ejemplo, se calcula antes (2*4)+(0+1) = 9 y se busca ese número en la lista.
Una vez complicado, enlazado y ejecutado me sale un mensaje que dice "Violación de segmento (se ha volcado la memoria)" y no sé a qué se refiere.
Os dejo el código a ver si podeis encontrar vosotros la solución:
Muchas gracias por anticipado.
Este programa trata de buscar un determinado elemento de una lista normal de 12 elementos dividida virtualmente en una matriz 4x3. El formato secuencial es
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12
Pero virtualmente se dimensiona así
Linea 0 : 1,2,3,4
Linea 1: 5,6,7,8
Linea 2: 9,10,11,12
Como buscamos el 2,0 como ejemplo, se calcula antes (2*4)+(0+1) = 9 y se busca ese número en la lista.
Una vez complicado, enlazado y ejecutado me sale un mensaje que dice "Violación de segmento (se ha volcado la memoria)" y no sé a qué se refiere.
Os dejo el código a ver si podeis encontrar vosotros la solución:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
; myarray2D.asm
; ---- Manejando matrices en 2D ----
; Busca el elemento lista[2,0] en un array lista de (4x3)
; es decir buscará el noveno valor (4*2+1 = 9)
; después lo imprimirá en pantalla.
; Es equivalente a resultado=lista[2,0];
; Se ha compilado con nasm -f elf myarray.asm
; Se ha linkado con ld -m elf_i386 myarray.o -o myarray
; Asignación de constantes
DIMX EQU 4
DIMY EQU 3
COORDX EQU 2
COORDY EQU 0
ITEM EQU ((COORDX * DIMX) + (COORDY +1))
; Asignación de variables
section .data
lista db 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12
resultado db 0
; Proceso de programación
section .text
global _start ;el enlazador pide _start
_start:
mov edx,0 ;contador de elementos a cero
mov ebx,0 ;contenedor de valores a cero
mov ecx, lista ;apunta a la lista
buscar:
mov ebx, [ecx] ;guardamos el valor de la lista
add ecx,1 ;apunta al sig. elemento de la lista
inc edx ;incrementamos el contador
cmp edx, [ITEM] ;comparar contador con item=9
jl buscar ;si es menor repite buscar
transferir:
add ebx, '0' ;Convertimos el dato en número
mov [resultado], ebx ;Transferimos el dato a resultado
mostrar_resultado:
mov edx,2 ;longitud max. de la impresión
mov ecx, resultado ;imprimimos resultado
mov ebx, 1 ;descriptor de salida (stdout)
mov eax, 4 ;codigo de escritura (sys_write)
int 0x80 ;interrupción kernel
salir:
mov eax, 1 ;codigo de salida del programa (sys_exit)
int 0x80 ;interrupción kernel
Muchas gracias por anticipado.
Valora esta pregunta
0