零标志在程序状态字中不带零标志的实现
Implementation of zero flag without zero flag in program status word
在典型的处理器的 PSW 中,没有实现零标志,但是,它具有进位、符号、奇偶校验和溢出标志。在这种架构中,程序员将如何实现 JZ(零跳转)。
如果没有零标志,则不能在add reg, reg
这样的任意指令之后执行JZ,其他标志的none携带相同的信息。例如8位-128 + -128溢出并进位到0,但你无法将它与溢出/进位到127的-128 + -1区分开来。或者即使在SF的帮助下你也无法区分的各种其他组合和大前锋。
这就是为什么我们在普通 ISA 中有一个零标志,包括您正在使用其标志和助记符的 8080 或 x86。
您实际上只是想模拟 x86 test eax,eax
/ jz
或 ARM cbz reg, target
(conditional-branch 在寄存器上为零)来测试寄存器并在以下情况下跳转它是零?
注意0
是唯一的数字unsigned-below1,所以你可以cmp / jnc。这看起来像是家庭作业,所以我不会再详细说明了。
或者做 MIPS 所做的事情,并提供一条类似于 beq $reg, $reg, target
的指令,您可以在任何一对 regs 上使用它来 compare-and-branch。 (MIPS 根本没有 PSW / FLAGS)。 MIPS 有一个始终读为零的体系结构零寄存器,因此您始终可以使用一条机器指令分支到任何其他为零的寄存器。
ARM Thumb 和 AArch64 提供了一个有限的版本:cbz
和 cbnz
单个寄存器上的 compare/branch 为零或 non-zero,与ARM 标志寄存器。
但实际上,如果您要使用 FLAGS / PSW 寄存器,请实施零标志。这是最基本的有用的东西之一。虽然公平地说,进位标志更为关键。如果你只能有一个标志,它可能会进位,因为你仍然可以有效地测试零。不过,用 SF 和 OF 更难模拟更大或更小的有符号比较。
在典型的处理器的 PSW 中,没有实现零标志,但是,它具有进位、符号、奇偶校验和溢出标志。在这种架构中,程序员将如何实现 JZ(零跳转)。
如果没有零标志,则不能在add reg, reg
这样的任意指令之后执行JZ,其他标志的none携带相同的信息。例如8位-128 + -128溢出并进位到0,但你无法将它与溢出/进位到127的-128 + -1区分开来。或者即使在SF的帮助下你也无法区分的各种其他组合和大前锋。
这就是为什么我们在普通 ISA 中有一个零标志,包括您正在使用其标志和助记符的 8080 或 x86。
您实际上只是想模拟 x86 test eax,eax
/ jz
或 ARM cbz reg, target
(conditional-branch 在寄存器上为零)来测试寄存器并在以下情况下跳转它是零?
注意0
是唯一的数字unsigned-below1,所以你可以cmp / jnc。这看起来像是家庭作业,所以我不会再详细说明了。
或者做 MIPS 所做的事情,并提供一条类似于 beq $reg, $reg, target
的指令,您可以在任何一对 regs 上使用它来 compare-and-branch。 (MIPS 根本没有 PSW / FLAGS)。 MIPS 有一个始终读为零的体系结构零寄存器,因此您始终可以使用一条机器指令分支到任何其他为零的寄存器。
ARM Thumb 和 AArch64 提供了一个有限的版本:cbz
和 cbnz
单个寄存器上的 compare/branch 为零或 non-zero,与ARM 标志寄存器。
但实际上,如果您要使用 FLAGS / PSW 寄存器,请实施零标志。这是最基本的有用的东西之一。虽然公平地说,进位标志更为关键。如果你只能有一个标志,它可能会进位,因为你仍然可以有效地测试零。不过,用 SF 和 OF 更难模拟更大或更小的有符号比较。