Dado el siguiente código:¿Qué significan los corchetes en x86 asm?
L1 db "word", 0
mov al, [L1]
mov eax, L1
¿Qué significan los corchetes ([L1]) representan?
Dado el siguiente código:¿Qué significan los corchetes en x86 asm?
L1 db "word", 0
mov al, [L1]
mov eax, L1
¿Qué significan los corchetes ([L1]) representan?
[L1]
significa el contenido de la memoria en la dirección L1. Después de ejecutar mov al, [L1]
aquí, el registro al
recibirá el byte en la dirección L1 (la letra 'w').
Los corchetes significan la desreferencia de una dirección. Por ejemplo
mov eax, [1234]
medios, MOV los contenidos de dirección de 1234 a EAX. Por lo tanto:
1234 00001
EAX contendrá 00001.
Al igual que con muchos lenguajes de ensamblador, esto significa indirecta. En otras palabras, el primer mov
carga al
con el contenido de L1
(el byte 'w'
en otras palabras), no la dirección.
Su segundo mov
carga actualmente eax
con la dirección de L1
y se puede eliminar la referencia más adelante que para obtener o establecer su contenido.
En ambos casos, L1
se considera conceptualmente como la dirección.
Significan que en lugar de mover el valor del registro o un valor numérico L1
en el registro al
, tratar el valor del registro o un valor numérico L1
como un puntero en la memoria, buscar el contenido de esa dirección de memoria, y mover que los contenidos en al
.
En este caso, L1 es una ubicación de memoria, pero la misma lógica se aplicaría si un nombre de registro fue en los soportes:
mov al, [ebx]
también conocido como una carga.
Indica que el registro debe usarse como un puntero para la ubicación real, en lugar de actuar sobre el registro en sí.
Direct memory addressing - al
se cargará con el valor ubicado en la dirección de memoria L1
.
Simplemente significa obtener la memoria en la dirección marcada con la etiqueta L1.
Si te gusta C, y luego pensar en ello como esto: [L1]
es lo mismo que *L1
esto puede ser confuso ya que en C '* p' significa que _dereferencia p y deja de recuperar caracteres cuando llegue a' \ 0'_ y no solo a_dereferencia el primer carácter de la secuencia/cadena apuntada por p_ – user2485710
@ user2485710 No, '* p' significa desreferencia el carácter señalado por' p'. Las cadenas no tienen nada que ver con esto. – Navin
Operandos de este tipo, tales como [ebp]
, son llamados memory operands.
Todas las respuestas aquí son buenos, pero no veo que ninguno habla de la salvedad en el seguimiento de esto como una regla rígida - si los soportes, a continuación, eliminar la referencia, , excepto cuando es la instrucción lea
.
lea
es una excepción a la regla anterior. Decir que hemos
mov eax, [ebp - 4]
El valor de ebp
se resta por 4 y los paréntesis indican que el valor resultante se toma como una dirección y el valor que reside en esa dirección se almacena en eax
. Sin embargo, en caso de lea
's, los soportes podrían no significa que:
lea eax, [ebp - 4]
El valor de ebp
se resta por 4 y el valor resultante se almacena en eax
. Esta instrucción solo calcularía la dirección y almacenaría el valor calculado en el registro de destino. Ver this post para más detalles.
Gracias por su respuesta, estoy empezando a aprender asm. Si entiendo esto correctamente, "mov, [L1]" movería 'w' a al, y "mov eax, L1" movería la dirección de L1 a eax. ¿Es eso correcto? – joek1975
sí. y si hiciste 'mov ebx, L1 - mov al, [ebx]' entonces 'al' sería 'w' en ese caso también. – Earlz
La excepción a esto es LEA. –