Intel x86 汇编 - 读取和复制进位标志

Intel x86 Assembly - Reading and copying the carry flag

我目前正在创建一个将十进制转换为二进制的程序。我目前正在使用移位方法来获取 0 和 1。

我查看了导致使用 LAHF 和 PUSHF 访问标志并设置它的其他线程;然而,我想要做的就是获取进位标志的当前值并将其存储到寄存器中(即:当前位置的 1 或 0),稍后将其复制到数组中。由于我对 LAFH 或 PUSHF 不太熟悉,我想知道您是否可以使用 LAFH 或 PUSHF 完成我上面提出的相同任务。

例如,我想将当前的CF移动到eax中:mov edx,cf(我知道这行不通,但我正在寻找这样的东西) .在我复制了 1 或 0 之后,我将把它移到从 C++ 程序传递过来的数组中。

只做一个基于进位的条件赋值:

mov eax, 1
jc carry_set ; If carry is indeed set, skip the next line
mov eax, 0
carry_set:

一般来说,进位通常用于条件跳转,而不是作为一个值。看看是否可以用这种方式重新制定更大的代码。

编辑:现代英特尔 CPU 也有条件移动命令:

mov eax, 0
cmovc eax, 1 ; assign if carry is set

几乎与这个问题相同: check if carry flag is set

你可以使用JC、JNC根据进位标志进行分支,然后将1或0移动到你要使用的寄存器中。

或者使用ADC命令。

mov eax, 0
adc eax, 0

我要补充一点,PUSHF 然后弹出到寄存器中并用 XOR 屏蔽掉你想要的位也可以。 ADC 方法可能是最好的

我发现在 EDX 中存储进位最明显的方法是:

setc  dl
movzx edx, dl

它比其他答案中提出的方法更短(6 字节),但最短的(5 字节)必须是:

pushfd
pop   edx
and   edx, 1

你总是可以尝试减去借位。例如...

SBB EAX, EAX

如果设置了进位标志,EAX 将为 0xFFFFFFFF。如果是clear,结果就是0x00000000.