¿Cómo mover 3 bytes (24 bits) de la memoria a un registro?
Puedo mover elementos de datos almacenados en la memoria, a un registro de propósito general de mi elección, usando elMOV
instrucción.
MOV r8, [m8]
MOV r16, [m16]
MOV r32, [m32]
MOV r64, [m64]
Ahora, no me disparen, pero cómo se logra lo siguiente:MOV r24, [m24]
? (Agradezco que esto último no sea legal).
En mi ejemplo, quiero mover los caracteres "Pip", es decir, 0x706950h, para registrarrax
.
section .data ; Section containing initialized data
14 DogsName: db "PippaChips"
15 DogsNameLen: equ $-DogsName
Primero consideré que podía mover los bytes por separado, es decir, primero un byte, luego una palabra o alguna combinación de los mismos. Sin embargo, no puedo hacer referencia a las "mitades superiores" deeax
, rax
, así que esto se cae en el primer obstáculo, ya que terminaría sobreescribiendo los datos que se movieron primero.
Mi solución:
26 mov al, byte [DogsName + 2] ; move the character “p” to register al
27 shl rax, 16 ; shift bits left by 16, clearing ax to receive characters “pi”
28 mov ax, word [DogsName] ; move the characters “Pi” to register ax
Podría declarar "Pip" como un elemento de datos inicializado, pero el ejemplo es solo eso, un ejemplo, quiero entender cómo hacer referencia a 24 bits en el ensamblaje, o 40, 48 ... para el caso.
¿Hay alguna instrucción más parecida aMOV r24, [m24]
? ¿Hay alguna manera de seleccionar un rango de direcciones de memoria, en lugar de proporcionar el desplazamiento y especificar un operador de tamaño? ¿Cómo mover 3 bytes de la memoria para registrarse en ASM x86_64?
NASM versión 2.11.08 Arquitectura x86