进位标志可以包含哪些值,以及如何在x86汇编中检查其状态?

时间:2013-01-29 02:28:50

标签: assembly x86 nasm

  1. 进位标志可以包含哪些值?它只是0x00和0x01(布尔值)还是像其他CPU寄存器一样是16(或32/64)位?

  2. 如何查看其状态?我是否像普通的CPU寄存器一样使用它,如cmp cf, 0x00然后jg <jump destination>

  3. 我正在写一个迷你操作系统。将它用于我自己的目的是好的做法,还是应该为CPU的独占写权限保留,我所做的只是从中读取?

2 个答案:

答案 0 :(得分:9)

它是一个标志,它只能包含真或假(技术上为1或0,但有效地如图所示的真值)。

在使用它方面,不,你不要将它与某些东西进行比较,然后使用jg。它与相同的抽象级别与其他标志相同,因此您可以使用:

jc somewhere         ; jump if carry flag is set
jnc somewhere_else   ; jump if carry flag is not set

它是由某些指令自动设置的,例如,要添加两个值并检测进位,您可以使用以下内容:

add ax,bx
jc  too_big

虽然它主要由这些说明设置,但您也可以使用stc(设置),clc(清除)和cmc(补充)手动设置。例如,如果您正在进入一个将值转移到下一次迭代的循环,那么事先清除它通常很有用。

答案 1 :(得分:0)

这本小书曾经附带了borland turbo汇编程序,列出了所有x86指令,以及它们的cpu周期数和每个处理器型号受影响的标志...我建议你去找其中一本书阅读... 2:不,你不能直接在标志REGISTER上使用cmp等,因为它不是内存而是cpu中的寄存器,但是你可以使用一些指定的结果或者将整个事物首先移动到堆栈然后进入ram或其他使用下面的说明来解决这个问题

CLC(清除(0)进位) STC(将进位标志设置为1) JC(分支如果随身携带) JNC(分支如果没有设置) PUSHF(流行标志到堆栈) POPF(将堆栈上的最新条目移动到标志寄存器中)

如果我没记错的话......可能还有更多的做法。