Assembly 英特尔x86汇编-读取和复制进位标志

Assembly 英特尔x86汇编-读取和复制进位标志,assembly,computer-science,flags,Assembly,Computer Science,Flags,我目前正在创建一个将十进制转换为二进制的程序。我目前正在使用移位法来获得0和1 我已经研究了其他线程,这些线程导致使用LAHF和PUSHF访问标志并进行设置;但是,我要做的就是获取进位标志的当前值,并将其存储到寄存器中(即:当前位置的1或0),然后将其复制到数组中。由于我对LAFH或PUSH不太熟悉,我想知道您是否可以使用LAFH或PUSH完成我上面要求的相同任务 例如,我想将当前CF移动到eax:mov-edx,CF(我知道这不起作用,但我正在寻找类似的内容)。在我复制了1或0之后,我将把它移

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

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


例如,我想将当前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:
通常,进位通常用于条件跳转,而不是作为值。看看是否可以用这种方式重新编写更大的代码

编辑:现代Intel CPU还具有条件移动命令:

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

与这个问题几乎相同:

您可以使用JC、JNC根据进位标志进行分支,然后将mov1或0放入您想要使用的寄存器中

或者使用ADC命令

mov eax, 0
adc eax, 0

我将添加PUSHF,然后弹出到寄存器中,并用异或屏蔽掉您想要的位。ADC方法可能是最好的

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

setc  dl
movzx edx, dl
它比其他答案中提出的方法短(6字节),但最短(5字节)必须为:

pushfd
pop   edx
and   edx, 1

整数已经是二进制的了。“将整数转换为二进制”是指将二进制整数转换为基数为2的ASCII表示形式吗?使用
setc
指令。e、 g.,
setcdl
@RossRidge对不起,我的意思是将十进制值转换成二进制。(基地10至基地2代表)谢谢!这在我的汇编程序中运行得非常完美。@guest什么掩码您使用上一段中所述的
XOR
指令挑出进位?谢谢您的回复!如果我能选择两个答案就好了!这两种方法似乎都很好,因为我刚刚测试了这两种方法,并以相同的结果结束。
setc al/movzx eax,al
将比这两种方法都好得多
setcc
自386年以来一直存在。较短:
xor edx,edx/
生成标志
/setc dl
。性能良好的5个字节(选择
xor
之前或
movzx
之后。最短:
sbb-edx,edx
2个字节,性能也相当好。或者
sbb-edx,edx/neg-edx
4个字节,如果您确实需要0/1而不是0/-1。
sbb-reg,reg
在某些情况下实际上由gcc使用。(例如,可参见
/bin/ls
的反汇编。)我没票了,否则我会投这个。其他的答案都很疯狂。@AndrewNguyen:你应该把你的accept改成这个答案。这样更好。@PeterCordes你的第一个例子通过
XOR
松开进位标志。哦,对了。当然,你必须把XOR放在生成标志的指令之前,我应该这么说。修正d在编辑窗口内:)