汇编MOV指令操作数

ari*_*ess 1 assembly

当我们想要创建一个这样的初始化变量时:

name db 'zara ali'
Run Code Online (Sandbox Code Playgroud)

我们创建了一个字节大小变量,但我们在其中存储了一个字符串

怎么可能?

当我们使用这个指令时:

MOV ecx, name
Run Code Online (Sandbox Code Playgroud)

我们在4字节大小的寄存器中存储了一个字节大小的变量,而在MOV指令中,两个操作数必须大小相同.怎么可能?

Mar*_*oom 7

name db 'zara ali' 只是一个简写

name db 'z', 'a', 'r', 'a', ' ', 'a','l','i'
Run Code Online (Sandbox Code Playgroud)

这是另一种简写

name db 'z'
     db 'a'
     db 'r'
     db 'a'
     db ' '
     db 'a'
     db 'l'
     db 'i'
Run Code Online (Sandbox Code Playgroud)

因此,这是一个字节序列,第一个地址被赋予名称name.

MOV ecx, name在不同的汇编程序中有不同的语义.
在NASM它不读取所述可变name它存储该符号的值nameecx-它是等效于TASM/MASM符号

mov ecx, OFFSET name
lea ecx, name           ;This is an abuse of notation but valid in TASM
Run Code Online (Sandbox Code Playgroud)

在MASM/TASM中,它ecx在地址处读取DWORD(通过使用DWORD寄存器暗示)name,从而读取前四个字节(zara).
它等同于mov ecx, [name]mov ecx, DWORD [name]在NASM中.