我正在阅读 CSAPP 程序的第 3 章机器级表示。
testl S2, S1
以上指令基于S2&S1。所以
testl %eax, %eax
看%eax是负数、零还是正数。我不明白这个用法。请给我一些解释,谢谢。
TEST 指令与 AND 指令相同,只是它不存储结果。它只修改标志。它修改以下标志:符号、奇偶校验、零、进位(始终为 0)和溢出(始终为 0)。
testl %eax, %eax
jz zeroLabel ; jump if EAX is zero
js negLabel ; jump if EAX is negative
jns posLabel ; jump if EAX is positive
希望这可以帮助。
只是设置一个标志,使用后使用的以下指令通常是检查标志的条件跳转。针对自身测试寄存器只是设置 cpu 标志(如您提到的 neg,零,pos)。
测试指令执行 S1 AND S2,所以本质上 EAX AND EAX 就是 EAX。