以下代码的含义是什么?
mov si, [L10003248]
test si, si
jnz L10004356
我认为这意味着如果L10004356
地址不为空,则跳转到L10003248
。我认为它与L10003248
中存储的值无关,否则使用word ptr
。
我的假设是否正确?
这听起来不合逻辑。因为这种跳跃看起来微不足道。
我没有关于编译器的信息。
答案 0 :(得分:2)
mov si, [L10003248]
确实与位于 L10003248
的内存位置有关,而不仅仅是地址。这由方括号唯一标出。
[...]否则它使用了字ptr [...]
不,word ptr
并不表示内存位置,而是指示内存位置的大小。
参加指示
mov [eax], 12h
现在,汇编程序可以猜出12h
的大小。是16位(0012h
)?还是8位(12h
)?这需要作为信息传递给汇编程序。在这里,ptr
指令发挥作用:
mov word ptr [eax], 12h
现在,汇编程序明确知道必须复制16位数据。同样,可以添加byte ptr
和dword ptr
。有关ptr
指令的更多信息,请阅读this。
另一种情况可以是
mov [16_bit_mem], 12h
一些汇编程序(如MASM)记住变量的大小,因此该指令编译得很好。 OTOH,有些人(比如NASM和GNU)没有。在NASM中,您需要编写
mov word ptr [16_bit_mem], 12h
向汇编程序提供数据大小。 GNU as默认使用AT& T语法(与MASM和NASM使用的Intel语法相反)。在这里,您为b
添加后缀byte
,w
添加word
,l
添加long
,q
for quadword
)到助记符而不是ptr
指令:
movw 0x12, (16_bit_mem)
当然是AT& T语法(源和目标操作数,交换,0x
而不是h
等)。
答案 1 :(得分:2)
[L10003248]表示* L10003248,它是存储在地址L10003248中的值。
所以你的代码实际上意味着:
si = *L10003248;
if (si != 0)
jmp L10004356