当我们想要创建一个这样的初始化变量时:
name db 'zara ali'
我们创建了一个字节大小的变量,但我们在其中存储了一个字符串
怎么可能?
当我们使用这条指令时:
MOV ecx, name
我们在4字节大小的寄存器中存储了一个字节大小的变量,而在MOV指令中,两个操作数必须大小相同。 怎么可能??
答案 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]
。