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.
我目前正在创建一个将十进制转换为二进制的程序。我目前正在使用移位方法来获取 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.