Resumen
NASM salida 2.10.09 ELF:
db
no tiene ningún efectos mágicos: simplemente da salida bytes directamente en el fichero objeto de salida.
Si esos bytes están delante de un símbolo, el símbolo apuntará a ese valor cuando se inicie el programa.
Si se encuentra en la sección de texto, sus bytes se ejecutarán.
Tiempo que usa db
o dw
, etc.eso no especifica el tamaño del símbolo: el campo st_size
de la entrada de la tabla de símbolos no se ve afectado.
equ
hace que el símbolo en la línea actual tenga st_shndx == SHN_ABS
valor mágico en su entrada de tabla de símbolos.
En lugar de enviar un byte a la ubicación del archivo de objeto actual, lo envía al campo st_value
de la entrada de la tabla de símbolos.
Todo lo demás se deduce de esto.
Para entender lo que realmente significa, primero debe comprender the basics of the ELF standard y .
teoría SHN_ABS
SHN_ABS
le indica al enlazador que:
- reubicación no debe ser hecho en este símbolo
- el campo de la introducción de símbolos
st_value
es para ser utilizado como un valor directamente
Contraste esto con símbolos "regulares", en el que el v Al contrario, el símbolo del símbolo es una dirección de memoria y, por lo tanto, debe pasar por la reubicación.
Dado que no apunta a la memoria, el enlazador puede eliminar efectivamente los símbolos SHN_ABS
del enlazador al delimitarlos.
Pero todavía son símbolos regulares en los archivos de objeto y do ocupan la memoria allí, y podrían compartirse entre varios archivos si es global.
Ejemplo de uso
section .data
x: equ 1
y: db 2
section .text
global _start
_start:
mov al, x
; al == 1
mov al, [y]
; al == 2
Tenga en cuenta que dado que el símbolo x
contiene un valor literal, sin eliminar la referencia []
debe hacerse para ella como para y
.
Si se quiere utilizar x
de un programa en C, que íbamos a necesitar algo como:
extern char x;
printf("%d", &x);
y ajustar en las asm:
global x
La observación empírica de salida generada
Podemos observar lo que hemos dicho antes con:
nasm -felf32 -o equ.o equ.asm
ld -melf_i386 -o equ equ.o
Ahora:
readelf -s equ.o
contiene:
Num: Value Size Type Bind Vis Ndx Name
4: 00000001 0 NOTYPE LOCAL DEFAULT ABS x
5: 00000000 0 NOTYPE LOCAL DEFAULT 1 y
Ndx
es st_shndx
, por lo que vemos que es x
SHN_ABS
mientras que no es y
.
ver también que Size
es 0
para y
: db
de ninguna manera y
dijo que se trataba de un solo byte de ancho. Simplemente podríamos agregar dos directivas db
para asignar 2 bytes allí.
Y luego:
objdump -dr equ
da:
08048080 <_start>:
8048080: b0 01 mov $0x1,%al
8048082: a0 88 90 04 08 mov 0x8049088,%al
Y vemos que se 0x1
entre líneas en la instrucción, mientras que y
tiene el valor de una dirección de reubicación 0x8049088
.
Probado en Ubuntu 14.04 AMD64.
Docs
http://www.nasm.us/doc/nasmdoc3.html#section-3.2.4:
EQU define un símbolo a un valor constante dado: cuando EQU se utiliza, la línea de fuente debe contener una etiqueta. La acción de EQU es definir el nombre de etiqueta dado al valor de su (único) operando. Esta definición es absoluta, y no puede cambiar más tarde. Así, por ejemplo,
message db 'hello, world'
msglen equ $-message
define msglen para ser la constante de 12. msglen no puede entonces ser redefinido más tarde. Esta tampoco es una definición de preprocesador: el valor de msglen se evalúa una vez, usando el valor de $ (ver sección 3.5 para una explicación de $) en el punto de definición, en lugar de ser evaluado donde sea que se haga referencia y usando el valor de $ en el punto de referencia.
Ver también
pregunta análoga para GAS: Difference between .equ and .word in ARM Assembly?.equiv
parece ser el equivalente cierra GAS.
NASM 2.10.09 OBJETOS de salida ELF: 1) "no se generan datos": verdadero para el ejecutable después del enlace y espacio RAM, pero el archivo objeto que NASM genera contiene los datos del símbolo. 2) "similar a C's #define": en cierto sentido, pero 'equ' genera un símbolo, que podría ser utilizado por otros archivos de objetos con' extern' y sin incluir la macro en esos archivos. Más detalles: http://stackoverflow.com/a/33148242/895245 –
Buenos puntos, @Ciro, pensé que el significado era obvio desde el contexto pero, para estar seguro, he cambiado los datos al código para garantizar la claridad. En cuanto al '# define', la similitud no es necesariamente la igualdad, pero intentaré aclarar eso también :-) – paxdiablo