程序集x86测试si

时间:2015-10-19 08:49:21

标签: assembly x86 reverse-engineering

以下代码的含义是什么?

mov si, [L10003248]
test si, si
jnz L10004356

我认为这意味着如果L10004356地址不为空,则跳转到L10003248。我认为它与L10003248中存储的值无关,否则使用word ptr

我的假设是否正确?

这听起来不合逻辑。因为这种跳跃看起来微不足道。

我没有关于编译器的信息。

2 个答案:

答案 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 ptrdword 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添加后缀bytew添加wordl添加longq for quadword)到助记符而不是ptr指令:

movw 0x12, (16_bit_mem)

当然是AT& T语法(源和目标操作数,交换,0x而不是h等)。

答案 1 :(得分:2)

[L10003248]表示* L10003248,它是存储在地址L10003248中的值。

所以你的代码实际上意味着:

si = *L10003248;
if (si != 0)
    jmp L10004356