【发布时间】:2017-05-01 16:30:30
【问题描述】:
我将 x86 程序集与 Irvine 库一起使用。
检查寄存器值是否为零的最简单方法是什么?
我使用 cmp 指令,但我正在寻找替代方法。 这是我使用 cmp 指令的代码,寄存器是 ebx
cmp ebx,0
je equ1
mov ebx,0
jmp cont
equ1:
mov ebx,1
jmp cont
cont:
exit
这“布尔化”一个值,产生一个 0 或 1,就像 C 中的 int ebx = !!ebx 一样。
【问题讨论】:
-
您至少使用了 80386 条指令(
ebx在 8086 上不存在)。答案也取决于此代码之前的指令,零值的存在可能会被先前的指令“泄漏”,从而在测试中为您节省更多,否则常见的成语是test ebx,ebx设置 ZF。然后在 ebx 中将 ZF 变为 0/1 值是另一回事,test可能再次不是最佳解决方案的一部分。下定决心,是否要确定寄存器是否为零,或者是否要根据它将某个寄存器设置为0/1。 #mov ebx,0=xor ebx,ebx什么时候可以销毁标志。 -
为了说明我的观点(细节的重要性),假设前面的最后一条(标志和 ebx)修改指令是
neg ebx。然后sbb ebx,ebx将在ebx等于0 时将ebx设置为-1,对于非零值设置为0(进一步neg ebx将把它变成你原来的0/1 工作方式)。跨度> -
不适合我。
-
顺便说一句,我在
neg之后得到了sbb的结果。如果为零,它将保持零,对于非零,它将执行-1 ...所以要返回您的 0/1然后inc ebx会做。 # “没有和我一起工作” 我也没有。 (我不知道你在说什么) -
我可以发誓我们有这个问题的副本,但我没有找到它。但是,我确实发现了一堆隐含包含您问题的答案的问题,例如stackoverflow.com/questions/147173/…和stackoverflow.com/questions/13064809/the-point-of-test-eax-eax。它们都是关于
test当两个操作数都是同一个寄存器时所做的事情——这正是你想要的。test ebx, ebx+jz
标签: assembly x86 micro-optimization