Duda resuelta
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
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.
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.
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
push dword eax
pop dword eax
mov dword [ebp-4], eax
lea eax, [ebp-4]
Como dices que generaste ese codigo asm?
Saludos
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.
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.
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
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
DSuda resuelta
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.
Hay algún buen debugger que me recomendéis?
En linux esta el GDB y en windows podrias probar con olly debug o con IDA.
Saludos
Una duda, cuando intento cargar el numero 9999999999 se me desborda, hay algún registro más grande que dword eax?
Y porque cargas ese numero?
Mas grande? si es de 32 bits tu plataforma no.Que procesador estan usando?.
Las operaciones con numeros de mas longitud requieren otro tipo de operaciones.
Edito.
Segun leo:
CitarWith the Pentium MMX, eight 64-bit MMX integer registers were added (MMX0 to MMX7, which share lower bits with the 80-bit-wide FPU stack).[18] With the Pentium III, a 32-bit Streaming SIMD Extensions (SSE) control/status register (MXCSR) and eight 128-bit SSE floating point registers (XMM0 to XMM7) were added.
Si hay registros mas grandes, pero no se usarlos!! xD
Saludos!
Si tu plataforma soporta SSE2 tienes de 128 bits sin necesidad de 64 bits, pero son otras instrucciones las que los manejan.
Pero depuraste ya el code con un debbuger?
Un saludo.