2

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

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

例如,我想将当前 CF 移动到 eax:mov edx,cf(我知道这不起作用,但我正在寻找类似的东西)。在我复制了 1 或 0 之后,我会将它移动到从 C++ 程序传递的数组中。

4

4 回答 4

4

几乎与这个问题相同: 检查是否设置了进位标志

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

或者使用 ADC 命令。

mov eax, 0
adc eax, 0

我将添加 PUSHF 然后弹出到寄存器并用 XOR 屏蔽掉你想要的位也可以。ADC 方法可能是最好的

于 2015-11-18T18:53:16.767 回答
3

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

setc  dl
movzx edx, dl

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

pushfd
pop   edx
and   edx, 1
于 2015-11-19T11:19:34.323 回答
1

您可以随时尝试用借位进行减法。例如 ...

SBB EAX, EAX

如果设置了进位标志,EAX 将为 0xFFFFFFFF。如果清楚,结果将是 0x00000000。

于 2021-08-27T21:51:25.183 回答
1

只需根据进位进行条件赋值:

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
于 2015-11-18T18:51:44.503 回答