程序状态字中无零标志的零标志的实现

问题描述

在典型的处理器的PSW中,没有实现零标志,但是具有进位,符号,奇偶校验和溢出标志。在这种体系结构中,程序员将如何实现JZ(零跳)。

解决方法

如果没有零标志,则任何add reg,reg之类的任意指令之后都无法实现JZ,其他任何标志都不会携带相同的信息。例如8位-128 + -128溢出并携带为0,但是您无法将其与-128 + -1溢出/携带为127区别开来。或者甚至在SF的帮助下也无法区分的其他各种组合和PF。

这是原因,我们在普通的ISA(包括8080或x86)中使用零标志,这是您正在使用的标志和助记符。


您实际上只是想模拟x86 test eax,eax / jz或ARM cbz reg,target(寄存器的条件分支为零)来测试寄存器并在其为零时跳转吗?

请注意,0是唯一一个在1以下的无符号数字,因此可以进行cmp / jnc。这看起来像是作业,所以我不会再详细说明了。

或者执行MIPS的操作,并提供类似beq $reg,$reg,target的指令,您可以使用该指令在任何一对reg上进行比较和分支。 (MIPS根本没有PSW / FLAGS)。 MIPS具有一个体系结构的零寄存器,该寄存器始终读为零,因此您始终可以使用一条机器指令在其他任何为零的寄存器上跳转。

ARM Thumb和AArch64提供了以下内容的有限版本:cbzcbnz在单个寄存器为零或非零的位置进行比较/分支,与ARM标志寄存器分开。 / p>

但是实际上如果您将要拥有一个FLAGS / PSW寄存器,请实现一个零标志。那是最基本的有用的事情之一。尽管公平地说,进位标志更为重要。如果只有一个标志,则可能会带有进位,因为您仍然可以有效地测试零。不过,用SF和OF很难模仿或大或小的签名比较。