为什么我们需要一个标志来表示零结果?

问题描述 投票:0回答:2

在诸如shift,add,increment之类的指令中,我们总是检查结果,如果结果为零,我们在一个标志中指示。在什么情况下我们使用这个零旗?这个零旗的用途是什么?

assembly cpu-registers flags zero
2个回答
2
投票

我们将这些标志用于两个主要目的:

  • 条件执行代码(通常有分支/跳转指令,如果其中一个标志设置为特定值,则转移执行),这包括循环,而不仅仅是高级语言中的/ then / else语句
  • 复数算术和按位逻辑,包括任意精度算术(其中进位在非常长的整数的寄存器大小部分的加/减/移位之间传播)

并非所有CPU都有标志来描述ALU操作结果,包括零,负,无符号上溢/下溢(或者,进位/借位),有符号溢出,奇偶校验等。

MIPS CPU没有用于整数和按位运算的标志。具有条件分支,可以在以下条件上分支:

  • 登记平等/不平等
  • 将等式注册为零/非零
  • 寄存器小于/大于零
  • 寄存器大于/小于或等于零

如果需要这些分支不支持的不同类型的比较,则有特殊说明。他们将结果设置为0或1,然后条件分支可以将其用作输入。

MIPS处理器上的进位和溢出有点棘手。它们需要通过多个指令获得。


1
投票

通常,CPU的标志用于执行条件操作。

(一个例外是进位标志,它既用于条件运算,也用于诸如随身携带或减借等操作中的“进位”。)

在ARM CPU上,您可以根据零标志执行任何指令:例如,如果设置了零标志,则指令ldmeqda将与指令ldmda相同;零标志清除时,它什么都不做。

通常,您首先执行减法(使用cmp指令)来比较两个数字。如果两个数字相等,则设置零标志。只有当两个数字(非)相等时,才会执行下一条指令,因此您可以根据零标志的状态执行指令。

(指令cmp执行减法并丢弃结果!这意味着该指令仅根据减法结果设置标志。这在CoMParing两个数字时很有用;这就是指令命名为cmp的原因。)

在大多数其他具有标志的CPU(并非所有CPU都有它们)上,您只能根据标志的状态进行跳转(分支)。

你做的是如果标志的状态错误,你跳过不执行的指令。

示例(x86):

someloop:
    mov eax, [esi]
    add esi, 20
    add eax, 1234
    # The zero flag will be set if the result is 0
    # The next instruction will jump if the zero flag is set
    jz skipif
    # We only get here if the zero flag is clear
    # This corresponds to "if(eax!=0)" in C
    mov [esi-10],bl
skipif:
    dec edx
    # The zero flag is set if edx is not 0
    # Jump back to "someloop" if this is the case
    # This corresponds to a "do { ... } while((--edx)!=0);"
    # loop in C
    jnz someloop
© www.soinside.com 2019 - 2024. All rights reserved.