2011-02-03 8 views
6

¿Qué significa '$' seguido de un identificador?

x86 ensamblado, AT & T sintaxis.

+0

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

Respuesta

11

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.

2

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 .

Cuestiones relacionadas