¿Qué significa '$' seguido de un identificador?
x86 ensamblado, AT & T sintaxis.
¿Qué significa '$' seguido de un identificador?
x86 ensamblado, AT & T sintaxis.
En AT & T sintaxis $
significa tratar lo que sigue como una constante inmediata en lugar de una dirección de memoria. En otras palabras,
movl $_start, %eax
carga la dirección del símbolo _start
en% eax;
movl _start, %eax
lee 4 bytes de la memoria en la dirección de _start
en% eax. Si observa el desmontaje de ambos:
0: b8 00 00 00 00 mov $0x0,%eax
1: R_386_32 _start
5: a1 00 00 00 00 mov 0x0,%eax
6: R_386_32 _start
puede ver que la única diferencia es el código de operación. El útil, aunque algo egoístamente nombrado, Intel® 64 and IA-32 Architectures Software Developer's Manual (desea el volumen 2, que es la referencia del conjunto de instrucciones) dice que los códigos de operación B8 a BF codifican "cargar constante de 16/32 bits inmediata en el registro" (este es el código destinado a ser cargado en un segmento de código de 32 bits, por lo que es una carga de 32 bits; para una carga de 16 bits, tendría un byte de prefijo "anulación de tamaño de operando", 66) y el código de operación A1 codifica "carga de 32 bits cantidad en el desplazamiento de 32 bits especificado desde DS (o cualquier otro segmento, con el byte de prefijo apropiado) en EAX. " Con el típico modelo de memoria "plana", ese es el equivalente moral de "cargar una cantidad de 32 bits en una dirección absoluta de 32 bits", pero se puede ver cómo x86 consiguió su reputación como ridículamente complicada a nivel de máquina.
En caso de que se esté preguntando, esto es lo que se vería si utilizamos EBX lugar:
a: bb 00 00 00 00 mov $0x0,%ebx
b: R_386_32 _start
f: 8b 1d 00 00 00 00 mov 0x0,%ebx
11: R_386_32 _start
carga-inmediata todavía se puede hacer con una instrucción de un byte sin contar el operando (Es BB en lugar de B9, como cabría esperar, porque el orden de registro interno es AX, CX, DX, BX, SP, BP, SI, DI - en serio), pero la dirección de carga absoluta desde ahora tiene dos instrucción por bytes, 8B 1D; el segundo byte es lo que Intel llama un byte "ModRM", que especifica ambos EBX y que sigue una dirección absoluta de 4 bytes.
Generalmente significa un valor "inmediato", es decir, un número, a diferencia de otro valor de registro, algo recuperado de la memoria, etc. Por lo tanto, en este caso, está moviendo el número asociado con el símbolo _start
al registro eax .
Esta pregunta exacta es uno de los ejercicios de [Programación desde el principio] (http://programminggroundup.blogspot.ca/2007/01/programming-from-ground-up.html). – user240515