gpt4 book ai didi

assembly - 确定寄存器值是否等于零的最简单方法是什么?

转载 作者:行者123 更新时间:2023-12-04 13:57:30 36 4
gpt4 key购买 nike

我在 Irvine 库中使用 x86 程序集。

检查寄存器值是否等于零的最简单方法是什么?

我使用了 cmp 指令,但我正在寻找替代方法。
这是我使用 cmp 指令的代码,寄存器是 ebx

    cmp ebx,0
je equ1
mov ebx,0
jmp cont
equ1:
mov ebx,1
jmp cont
cont:
exit

这将“ bool 化”一个值,产生 0 或 1,如 int ebx = !!ebx会在 C.

最佳答案

可能“最简单”或最简单的“不在乎细节”的答案如何确定是:

    ; here ebx is some value, flags are set to anything
test ebx,ebx ; CF=0, ZF=0/1 according to ebx
jz whereToJumpWhenZero
; "non-zero ebx" will go here

; Or you can use the inverted "jnz" jump to take
; a branch when value was not zero instead of "jz".

有详细 answer from Peter Cordes to " testl eax against eax?" question关于设置标志的推理等。也有指向另一个类似答案的链接,但从性能的角度推理为什么它是最好的方法。 :)

如何在 eax 时将其他一些寄存器(我会选择 ebx )设置为 1为零,当 ebx 时为 0非零( ebx 本身的非破坏性方式):
    xor   eax,eax  ; eax = 0 (upper 24 bits needed to complete "al" later)
test ebx,ebx ; test ebx, if it is zero (ZF=0/1)
setz al ; al = 1/0 when ZF=1/0 (eax = 1/0 too)

或者如何转换 ebxebx时自身变为1/0为零/非零:
    neg   ebx      ; ZF=1/0 for zero/non-zero, CF=not(ZF)
sbb ebx,ebx ; ebx = 0/-1 for CF=0/1
inc ebx ; 1 when ebx was 0 at start, 0 otherwise

或者如何转换 ebxebx时自身变为1/0是零/非零,其他变体(在“P6”到​​“Haswell”核心上更快):
    test  ebx,ebx  ; ZF=1/0 for zero/non-zero ebx
setz bl ; bl = 1/0 by ZF (SETcc can target only 8b r/m)
movzx ebx,bl ; ebx = bl extended to 32 bits by zeroes

等等,等等......这取决于你的测试之前发生了什么,以及你真正想要的测试输出,有 许多 可能的方法(针对不同情况优化,针对不同 objective-c PU 优化)。

我将添加一些更常见的情况......一个从 N 到零的计数器循环递减计数,循环 N 次:
    mov   ebx,5   ; loop 5 times
exampleLoop:
; ... doing something, preserving ebx
dec ebx
jnz exampleLoop ; loop 5 times till ebx is zero

如何处理 word的5个元素(16b) 数组(以数组[0]、数组[1]、...顺序访问它们):
    mov   ebx,-5
lea esi,[array+5*2]
exampleLoop:
mov ax,[esi+ebx*2] ; load value from array[i]
; process it ... and preserve esi and ebx
inc ebx
jnz exampleLoop ; loop 5 times till ebx is zero

再举一个例子,不知何故,我非常喜欢这个:

如何在 eax 时将目标寄存器(示例中的 ebx)设置为 ~0 (-1)/0为零/非零并且您已经拥有值 1在某些寄存器中(在示例中为 ecx):
    ; ecx = 1, ebx = some value
cmp ebx,ecx ; cmp ebx,1 => CF=1/0 for ebx zero/non-zero
sbb eax,eax ; eax = -1 (~0) / 0 for CF=1/0 ; ebx/ecx intact

-1 可能看起来和 1 一样实用(至少用于索引目的),但 -1 也可以用作进一步的完整位掩码 and/xor/or操作,所以有时它更方便。

关于assembly - 确定寄存器值是否等于零的最简单方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41174867/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com