Testing 在ia32中测试寄存器是否等于自身
(ia32)例如Testing 在ia32中测试寄存器是否等于自身,testing,cpu-registers,x86,Testing,Cpu Registers,X86,(ia32)例如 test $eax, $eax 你为什么要这么做?它是$eax&$eax,对吗?这不应该总是设置标志寄存器来表示它们相等吗 附录: 因此,如果寄存器为零,测试将设置ZF(如下所述)。那个么,测试(如上所述)是否主要用于判断寄存器是否为空?如果是,则设置ZF?如果寄存器为零,则将设置ZF(零标志)。这可能是最常用的测试方法。它还将适当地设置其他标志,但这些标志的用处可能要小得多 另外,我应该提到,test实际上并不执行比较-它执行按位和操作(丢弃结果,除了标志) 要执行操作数的
test $eax, $eax
你为什么要这么做?它是$eax&$eax
,对吗?这不应该总是设置标志寄存器来表示它们相等吗
附录:
因此,如果寄存器为零,测试将设置ZF(如下所述)。那个么,测试(如上所述)是否主要用于判断寄存器是否为空?如果是,则设置ZF?如果寄存器为零,则将设置ZF
(零标志)。这可能是最常用的测试方法。它还将适当地设置其他标志,但这些标志的用处可能要小得多
另外,我应该提到,test
实际上并不执行比较-它执行按位和
操作(丢弃结果,除了标志)
要执行操作数的比较,将使用cmp
指令,该指令执行sub
操作,丢弃除标志外的结果。你说得对
cmp $eax, $eax
没有太多意义,因为每次都会根据零结果设置标志。这是设置零标志,与使用
或$eax相同,$eax
也可以对零标志进行非破坏性测试。它在处理器上设置Z和S标志,因此您可以在“测试eax,eax”之后进行判断(或任何其他寄存器8、16、32,我认为是64位)如果值为零,或者如果设置了符号位,则分别使用“je/jne/jz/jnz”或“js/jns”。在为x80/x86体系结构编写代码的30年中,我已经用大多数寄存器组合多次这样做了。(在ESP上实际上没有使用此选项!)
IIRC,还有一个奇偶校验位是经过计算的,所以通过这个测试,你可以用“jp/jnp”来判断寄存器中设置的位数是偶数还是奇数。我从来没有使用过它。此指令并非仅用于检查
%eax
的值是否为零。它可以作为一个整体用于检查%eax
的值是否为零或正或负。
以这种方式使用它的最大优点是它不会修改%eax
的值(在执行%eax&%eax
之后,它只会丢弃该值),并按如下方式设置条件标志
如果%eax值为零,OF,CF,ZF=0
(设置为零)else
SF=MSB的结果
(这里,结果是%eax&%eax
)。因此,如果这个数字是负数,我们得到SF=1
,否则SF=0
,那么上面的结果与“jne”一起使用。“jne”是否看ZF?是-jne(跳跃不相等)正在有条件地检查零标志是否有跳转。是-jne
将在未设置ZF
时跳转(jne
相当于jnz
,因为它们是相同的操作码)。可能重复