Testing 测试ECX,3个isn';t测试ECX指出的值

Testing 测试ECX,3个isn';t测试ECX指出的值,testing,assembly,x86,ollydbg,Testing,Assembly,X86,Ollydbg,我有这个: TEST ECX, 3 ECX包含包含字符'a'的地址存储器 但是,测试后,ZF设置为1!这怎么可能 以下是屏幕截图和指令。ZF指示上一条指令的结果是否为零。您的代码行根据测试结果有效地设置标志,包括ZF 0x42AA8C AND 0x03 它是0x00,因为0b1100和0b0011=0x00 因此,设置了零标志 有关TEST和其他x86指令的更多信息,请查看。ZF指示上一条指令的结果是否为零。您的代码行根据测试结果有效地设置标志,包括ZF 0x42AA8C AND 0x03

我有这个:

TEST ECX, 3
ECX
包含包含字符
'a'
的地址存储器

但是,测试后,ZF设置为1!这怎么可能


以下是屏幕截图和指令。

ZF指示上一条指令的结果是否为零。您的代码行根据测试结果有效地设置标志,包括ZF

0x42AA8C AND 0x03
它是
0x00
,因为
0b1100和0b0011=0x00

因此,设置了零标志


有关
TEST
和其他x86指令的更多信息,请查看。

ZF指示上一条指令的结果是否为零。您的代码行根据测试结果有效地设置标志,包括ZF

0x42AA8C AND 0x03
它是
0x00
,因为
0b1100和0b0011=0x00

因此,设置了零标志


有关
TEST
和其他x86指令的更多信息,请参阅。

您将
TEST
指令与寄存器操作数一起使用,因此将测试寄存器的内容。要测试内存位置,请使用内存操作数:

TEST DWORD PTR [ECX], 3

您将
TEST
指令与寄存器操作数一起使用,因此将测试寄存器的内容。要测试内存位置,请使用内存操作数:

TEST DWORD PTR [ECX], 3

0xc和0x3=0x00
,所以我不知道你为什么觉得这很奇怪。也许你想要
test[ecx],3
@cad,我想是的,因为他指定内存包含字符
'a'
,只有他想访问它时才相关。而且,
'a'
是97,这确实会像预期的那样导致
ZF=0
。PS:并非所有汇编程序都使用
PTR
。可能存在一些默认值,但例如nasm使用大小说明符,而不是
PTR
关键字,因此在nasm中,这将是
测试字节[ecx],例如3
。在这种情况下,大小并不重要,因为我们只检查低2位,对于byte、word、dword、qword:)@cad和Jester,大小仍然重要,如果地址是页面的最后一个字节,而下一页未映射。字节内存操作数可以工作;较大的内存操作数将执行一个跨到下一页的加载,并导致错误。我认为ISA需要一个CPU在下一页进行访问检查,并在更大的负载上出错,即使特定的微阵列通过在一个操作数中查找最高的设置位进行优化,而不是实际从缓存的另一侧进行加载或页面行拆分(如果值不重要)。
0xc和0x3=0x00
,所以我不知道你为什么觉得这很奇怪。也许你想要
测试[ecx],3
@cad我想是的,因为他指定内存包含字符
'a'
,只有当他想访问它时才相关。而且,
'a'
是97,这确实会像预期的那样导致
ZF=0
。PS:并非所有汇编程序都使用
PTR
。可能存在一些默认值,但例如nasm使用大小说明符,而不是
PTR
关键字,因此在nasm中,这将是
测试字节[ecx],例如3
。在这种情况下,大小并不重要,因为我们只检查低2位,对于byte、word、dword、qword:)@cad和Jester,大小仍然重要,如果地址是页面的最后一个字节,而下一页未映射。字节内存操作数可以工作;较大的内存操作数将执行一个跨到下一页的加载,并导致错误。我认为ISA需要一个CPU在下一页进行访问检查,并在更大的负载上出错,即使特定的微阵列通过在一个操作数中查找最高的设置位进行优化,而不是实际从缓存的另一端进行加载,或者如果值不重要,则进行页线拆分。