Duda urgente en NASM, ayuda por favor

Iniciado por Adri124, 28 Junio 2016, 14:28 PM

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

Adri124

Duda resuelta

AlbertoBSD

#1
Y cual es tu duda?

Si tienes alguna duda en especifico preguntala y te responderemos

Si no sabes programar en ASM hay varios tutoriales en los temas pegados en este subforo.

Por lo demas me parece deshonesto que alguien consiga su titulo universitario de esa forma. Podria resolver ese problema facilmente pero no tengo titulo universitario.

Saludos
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

Adri124

La duda que tengo es por qué produce violación de segmento. Llevo horas trackeando el error y no logro encontrarlo, por eso pido ayuda ya desesperadamente a alguien que sea capaz de encontrarlo, disculpa si te he molestado.

AlbertoBSD

El detalle que si te da un segment fault quiere decir que estas tratando de escribir en memoria no inicializada..
posiblemente uno de tus mov a alguna de las direcciones absolutas que manejas entre corchetes..

Ya que tu instruccion solo detecta un overflow a nivel de registro el cual solo se activa si el segundo numero es mas grande que el primero y resutado seria negativo si el overflow flag esta encendido.

Código (asm) [Seleccionar]
jo near error_4

La resta como tal esta bien pero el problema esta en alguno de los mov ya que te da segment fault y es distinto al overflow a nivel de registro.

La otra es que veo muchas instrucciones redundantes como

Código (asm) [Seleccionar]
push dword eax
pop dword eax


Código (asm) [Seleccionar]
mov dword [ebp-4], eax
lea eax, [ebp-4]


Como dices que generaste ese codigo asm?

Saludos
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

cpu2

Tienes alguna direccion de la violacion de segmento? Me gustaria depurarlo pero estoy fuera.

Pero como dice el compañero, el codigo esta lleno de instrucciones sin sentido alguno, de hay posibles errores.

Código (asm) [Seleccionar]
sub esp , 4*1

///////////////

push dword 2147483647
pop dword eax
mov dword [_x],eax

////////////////////////

push dword eax
pop dword eax
mov dword [_ressuma],eax
push dword _ressuma
pop dword eax
mov dword eax , [eax]
push dword eax


Por que todo eso? Dime mas datos sobre el error, y podre decirte algo, pero yo depuraria el codigo no el error, todas esas cosas sobran y te ahorras problemas.

Un saludo.

Adri124

#5
Muchas gracias por vuestras respuestas, respondiendo:

AlbertoBSD, el código lo genero con flex y bison, es un compilador de un lenguaje inventado muy similar a C, pero en este caso me está volviendo loco para detectar el fallo... me dice "Violación de segmento ("core" generado), y la verdad es que no sé cual es el mov que puede dar el fallo... he intentado depurarlos todos. Al menos la suma si que la realiza correctamente (30), después revienta.

No entiendo bien lo que me comentas del jo a nivel de registro, que es lo que debería fallar?

cpu2, el código puede ser algo caótico porque es generado en bison detectando expresiones, es un compilador que genera NASM dependiendo del código.

En cuanto a más detalles del error... llevo un buen rato intentando encontrar más información pero no doy con nada... solo sé que falla tras ejecutar la suma e imprimir el 30. Tras imprimir el 30, debería saltar a ****Error de ejecucion: overflow en resta

ACTUALIZACIÓN: Acabo de ver (intentando depurar a mi manera) que muy posiblemente la línea 126 sea la que provoca la violación de segmento. Esa instrucción es la que me carga en la variable x el valor 9999999999 para hacer la resta -9999999999 - 9999999999 que en lugar de provocar violación de segmento, debería ser detectada por jo y saltar, mostrando el código de error ****Error de ejecucion: overflow en resta

Por tanto, creo que podría ser un fallo en el jo, o en la carga del operando por ser demasiado grande... la verdad es que no sé realmente que es lo que falla ya

AlbertoBSD

El máximo valor dado por un entero de 32 bits sin signo es de hasta 4 mil millones y pasado...
No puedes simplemente asignar ese valor a una variable eax... Eso te va a dar un overflow en el registro.
Que es cuando se activa la bandera de overflow (Cosa que validas con tu jo

Pero es totalmente Diferente a un segment fault Este ultimo se da por que estas tratando de leer o escribir en una direccion de memoria inexistente.

Saludos
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

Adri124

#7
DSuda resuelta

cpu2

Pero no seria mejor ,utilizar algun debugger pata saber de donde procede el segmentation fault?

Y a partir de hay arreglsr el problema, es lo que intente decir antes,  depuralo y sabras el fallo.

Un saludo.

Adri124

Hay algún buen debugger que me recomendéis?