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

时间:2019-03-20 07:18:43

标签: assembly cpu-registers flags zero

在诸如 shift,add,increment 之类的指令中,我们始终检查结果,如果结果为零,则在标志中进行指示。 在什么情况下我们使用这个零标志? 零标志有什么用?

2 个答案:

答案 0 :(得分:2)

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

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

并非所有的CPU都具有以0,负数,无符号上溢/下溢(或进位/借位),有符号上溢,奇偶校验等描述ALU运算结果的标志。

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

  • 注册平等/不平等
  • 将相等性注册为零/非零
  • 注册小于/大于零
  • 寄存器大于/小于等于零

如果需要那些分支不支持的另一种比较,则有专门的说明。他们将结果设置为0或1,然后条件分支可以将其用作输入。

在MIPS处理器上执行和溢出有些棘手。它们需要通过多条指令获得。

答案 1 :(得分:1)

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

(有一个进位标志是一个例外,该标志既可用于条件运算,也可用于“带进位”或“借入减法”等操作中的“进位”。)

在ARM CPU上,您可以基于零标志执行任何指令:例如,如果设置了零标志,则指令ldmeqda与指令ldmda的作用相同;清除零标志后,它什么也不做。

典型地,您首先执行减法(使用cmp指令)以比较两个数字。如果两个数相等,则设置零标志。仅当两个数字不相等时才执行下一条指令,因此您将根据零标志的状态执行该指令。

(指令cmp执行减法并舍弃!这意味着该指令仅基于减法结果设置标志。当 C o MP 带有两个数字;这就是为什么该指令被命名为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