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在下一页进行访问检查,并在更大的负载上出错,即使特定的微阵列通过在一个操作数中查找最高的设置位进行优化,而不是实际从缓存的另一端进行加载,或者如果值不重要,则进行页线拆分。