que estoy tratando de hacer un salto relativo en ensamblador x86, sin embargo no puedo conseguir que funcione. Parece que por alguna razón mi salto sigue siendo reescrito como un salto absoluto o algo así.GCC/X86, Problemas con saltos relativos
Un programa sencillo ejemplo de lo que estoy tratando de hacer es esto:
.global main
main:
jmp 0x4
ret
Desde la instrucción JMP es de 4 bytes de longitud y un salto relativo está desplazado de la dirección del salto + 1, este debería ser una fantasía no-operativa. Sin embargo, compilar y ejecutar este código provocará un error de segmentación.
El verdadero rompecabezas para mí es que al compilarlo al nivel del objeto y luego desensamblar el archivo del objeto muestra que parece que el ensamblador está haciendo correctamente un salto relativo, pero después de compilarlo el enlazador lo está cambiando a otro tipo de salto.
Por ejemplo, si el código anterior estaba en un archivo llamado asmtest.s:
$gcc -c asmtest.s
$objdump -D asmtest.o
... Some info from objdump
00000000 <main>:
0: e9 00 00 00 00 jmp 5 <main+0x5>
5: c3 ret
Esto se ve como el ensamblador hizo correctamente un salto relativo, aunque es sospechoso que la instrucción JMP se llena de 0s.
Luego utiliza gcc para enlazar entonces desmontado y tiene esto:
$gcc -o asmtest asmtest.o
$objdump -d asmtest
...Extra info and other disassembled functions
08048394 <main>:
8048394: e9 6b 7c fb f7 jmp 4 <_init-0x8048274>
8048399: c3 ret
Esto me parece que el enlazador volvió a escribir la declaración JMP, o sustituido en el 5 por otra dirección.
Así que mi pregunta se reduce a, ¿qué estoy haciendo mal?
Soy yo que especifica el desplazamiento de forma incorrecta? ¿No estoy entendiendo cómo funcionan los saltos relativos? ¿GCC está tratando de asegurarse de que no haga cosas peligrosas en mi código?
Saltando a una etiqueta llamada es cómo los saltos se hacen normalmente en el montaje. Esto es muy básico. Supongo que el OP ya lo sabe y realmente desea codificar manualmente un salto relativo por algún motivo no especificado. –
Sospecho que el comentario fue en respuesta al mío. Lo eliminé mientras movía mi comentario a una respuesta. –
Gracias por la ayuda, esto funciona exactamente como yo lo necesito también. También gracias por señalar el problema con el salto demasiado lejos, no estaba seguro de exactamente de dónde se calculaba la instrucción. –