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

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

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

4

2 回答 2

13

这是一个标志,它只能保持真或假(技术上是 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(set)、clc(clear) 和cmc(complement) 手动设置。例如,如果您正在进入一个将值结转到下一次迭代的循环,那么事先清除它通常很有用。

于 2013-01-29T02:34:17.367 回答
1

这本小书曾经与 borland turbo 汇编器一起提供,其中列出了所有 x86 指令,以及它们的 cpu 周期数和每个型号的处理器分别受影响的标志……我建议你去找其中一本书阅读。 .. 2:不,您不能直接在标志 REGISTER 上使用 cmp 等,因为它不是内存,而是 cpu 中的寄存器,但是您可以使用几个指定的结果或先将整个东西移到堆栈上,然后再移入 ram 或与下面的说明相反

CLC(清除(0)进位位) STC(将进位标志设置为 1) JC(如果进位设置则分支) JNC(如果未设置进位则分支) PUSHF(将标志弹出到堆栈) POPF(将堆栈上的最新条目移动到标志寄存器中)

如果我没记错的话……可能还有更多的做事方式。

于 2017-05-01T15:18:47.997 回答