汇编MOV指令操作数

时间:2017-06-01 07:26:53

标签: assembly

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

name db 'zara ali'

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

怎么可能?

当我们使用这条指令时:

MOV ecx, name

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

1 个答案:

答案 0 :(得分:7)

name db 'zara ali'只是

的简写
name db 'z', 'a', 'r', 'a', ' ', 'a','l','i'

这是

的另一种简写
name db 'z'
     db 'a'
     db 'r'
     db 'a'
     db ' '
     db 'a'
     db 'l'
     db 'i'

因此,这是一个字节序列,第一个地址的名称为name

MOV ecx, name在不同的汇编程序中有不同的语义 在NASM中,它没有读取变量name,它将符号name的值存储在ecx中 - 它等同于TASM / MASM符号

mov ecx, OFFSET name
lea ecx, name           ;This is an abuse of notation but valid in TASM

在MASM / TASM中,它在地址ecx处读取DWORD(通过使用类似name的DWORD寄存器隐含),从而读取前四个字节(zara)。
它相当于NASM中的mov ecx, [name]mov ecx, DWORD [name]