组装 x86 测试 si
assembly x86 test si
下面的代码是什么意思?
mov si, [L10003248]
test si, si
jnz L10004356
我认为这意味着如果 L10003248
地址不为空则跳转到 L10004356
。我认为它与存储在 L10003248
中的值无关,否则它曾使用 word ptr
.
我的假设正确吗?
听起来不合逻辑。因为这个跳跃看起来微不足道。
我没有关于编译器的信息。
mov si, [L10003248]
与内存位置 at L10003248
有关,而不仅仅是地址。这由方括号唯一指示。
[...] otherwise it had used word 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 as)没有。在NASM中,需要写
mov word ptr [16_bit_mem], 12h
向汇编程序提供数据的大小。 GNU as 默认使用 AT&T 语法(与 MASM 和 NASM 使用的 Intel 语法相反)。在这里,您附加一个后缀(b
代表 byte
,w
,代表 word
,l
代表 long
,q
对于 quadword
) 到助记符而不是 ptr
指令:
movw 0x12, (16_bit_mem)
当然是 AT&T 语法(源和目标操作数,交换,0x
而不是 h
,等等)。
[L10003248]表示*L10003248,是地址L10003248中存储的值。
所以你的代码实际上意味着:
si = *L10003248;
if (si != 0)
jmp L10004356
下面的代码是什么意思?
mov si, [L10003248]
test si, si
jnz L10004356
我认为这意味着如果 L10003248
地址不为空则跳转到 L10004356
。我认为它与存储在 L10003248
中的值无关,否则它曾使用 word ptr
.
我的假设正确吗?
听起来不合逻辑。因为这个跳跃看起来微不足道。
我没有关于编译器的信息。
mov si, [L10003248]
与内存位置 at L10003248
有关,而不仅仅是地址。这由方括号唯一指示。
[...] otherwise it had used word 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 as)没有。在NASM中,需要写
mov word ptr [16_bit_mem], 12h
向汇编程序提供数据的大小。 GNU as 默认使用 AT&T 语法(与 MASM 和 NASM 使用的 Intel 语法相反)。在这里,您附加一个后缀(b
代表 byte
,w
,代表 word
,l
代表 long
,q
对于 quadword
) 到助记符而不是 ptr
指令:
movw 0x12, (16_bit_mem)
当然是 AT&T 语法(源和目标操作数,交换,0x
而不是 h
,等等)。
[L10003248]表示*L10003248,是地址L10003248中存储的值。
所以你的代码实际上意味着:
si = *L10003248;
if (si != 0)
jmp L10004356