¿Cómo obtengo la dirección de una etiqueta?

Quiero obtener la dirección de una etiqueta en ensamblador plano sin agregar código adicional

Ejemplo:

label1:  ;is at adress 0
db 1h,2h,3h,4h,5h  ;some data

label2:  ;is at adress 5 because label1 has 5 bytes of data

Podría imprimir la dirección en la pantalla de la consola, pero eso agrega tamaño al programa y cambia el resultado.

Soy consciente de que solo uso la etiqueta, pero quiero el número de dirección sin formato.

0
SeeSoftware 20 ago. 2016 a las 02:51

2 respuestas

La mejor respuesta

Solución rápida

Solo puse todos los símbolos al final del archivo de ensamblaje y luego lo miré con un editor hexadecimal:

Ejemplo:

label1: ;example label (can be anywhere)
;...
;... My Programm
;...

;the end of the program
db 0h ;just some spacer
dw label1
1
SeeSoftware 20 ago. 2016 a las 01:18

Cree su programa con símbolos de depuración, de modo que la tabla de símbolos (metadatos) del archivo de objeto incluya las direcciones de todas las etiquetas.

Luego puede usar objdump -t para volcar la tabla de símbolos del ejecutable, o cualquier otro programa que haga lo mismo.


Aparte de la tabla de símbolos, las direcciones de las etiquetas estarán en el binario incrustado en las instrucciones, p. Ej. en modos de direccionamiento absoluto para modos de direccionamiento, operandos inmediatos o como datos (por ejemplo, .dd label2). Los saltos normales utilizan una codificación relativa, por lo que no encontrará la dirección del símbolo absoluto en la codificación de instrucciones para los saltos.

TL: DR: es posible desensamblar el binario para encontrar direcciones absolutas, pero solo para las etiquetas utilizadas de esa manera, por lo que la tabla de símbolos es mucho más conveniente.


Si está ensamblando un binario plano (como un sector de arranque), no hay una tabla de símbolos en el formato de archivo. Por lo tanto, depende de tener información de símbolos de impresión FASM para usted, cuando usa una opción de línea de comandos para hacer eso. Busqué en Google y descubrí que hay una -s opción para escribir una { {X1}} archivo de salida de depuración de información de símbolo.

0
Peter Cordes 20 ago. 2016 a las 00:13