Ensamblador - Violación de Segmento (Se ha volcado la memoria)

 
Vista:
Imágen de perfil de Ferran
Val: 5
Ha mantenido su posición en Ensamblador (en relación al último mes)
Gráfica de Ensamblador

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:

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
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Ferran
Val: 5
Ha mantenido su posición en Ensamblador (en relación al último mes)
Gráfica de Ensamblador

Violación de Segmento (Se ha volcado la memoria)

Publicado por Ferran (2 intervenciones) el 14/08/2020 12:14:44
Vale, ya me lo respondo yo mismo

He quitado los corchetes en la linea 42 porque he comprendido que la instrucción CMP no compara direcciones efectivas sino valores de registros. Tambien he eliminado la linea 13 (que la puse para hacer otro proceso de hacer peticiones de búsqueda que sobrepasaran los límites de la tabla, pero que al final no hice) así que sobraba.

Tambien he modificado el comentario inicial que compilaba y enlazaba a otro programa anterior. Ahora está todo correcto.

Con esto el programa final queda así:

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
; 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 myarray2D.asm
; Se ha enlazado con ld -m elf_i386 myarray2D.o -o myarray2D
 
DIMX            EQU 4
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

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Violación de Segmento (Se ha volcado la memoria)

Publicado por Nacho (81 intervenciones) el 14/08/2020 12:41:55
No puedo ensamblar nada para debbuggear, que es como mejor se ven las cosas.

Los corchetes en asm son como el * en c.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar