当我们想要创建一个这样的初始化变量时:
name db 'zara ali'
Run Code Online (Sandbox Code Playgroud)
我们创建了一个字节大小变量,但我们在其中存储了一个字符串
怎么可能?
当我们使用这个指令时:
MOV ecx, name
Run Code Online (Sandbox Code Playgroud)
我们在4字节大小的寄存器中存储了一个字节大小的变量,而在MOV指令中,两个操作数必须大小相同.怎么可能?
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它存储该符号的值name在ecx-它是等效于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中.
| 归档时间: |
|
| 查看次数: |
278 次 |
| 最近记录: |