3

首先是一点背景。z80 CPU 有一条名为DJNZ的指令,可以以与for循环类似的方式使用。基本上 DJNZ 会减少 B 寄存器,如果不为零则跳转到标签。例如:

    ld      b,96                    ; erase all of the line
disp_version_erase_loop:
    call    _vputblank              ; erase pixels at cursor (uses b reg)
    djnz    disp_version_erase_loop ; loop 

当然,您可以使用常规比较和跳转指令来做同样的事情,但通常使用单条指令很方便。

顺便说一句,我的问题是,其他 CPU 架构是否包含类似的控制指令?

4

9 回答 9

7

实际上,在 IA-32 中,DJNZ 的直接等效项是 LOOPcc (LOOPZ)。请记住 Z80 和 8086 具有相同的前身Intel 8080。所以所有x86 CPU都直接继承DJNZ指令!

于 2010-02-22T08:19:29.617 回答
3

IA-32 有各种REP*使用 CX 作为计数器的指令

于 2010-02-22T03:30:12.000 回答
3

这是那个时代机器上相当普遍的指令,并且在许多其他地方也出现过。

等等

于 2010-02-22T03:35:51.760 回答
3

PowerPC 有一条bdnz带有特殊倒计时寄存器的指令ctr。递减ctr和条件分支在常规条件测试之上,因此您可以添加一个条件,例如,bdnzt eq, label如果设置了小于位并且ctr递减后为正,则将分支。

具有讽刺意味的是,ctr它也用于间接函数调用地址。因此,bdnz在具有间接调用的循环中变得相当无用,因为ctr保存和恢复它的成本超过了寄存器的特殊优势。指令存在一种编码,“ctr如果不为零,则递减并分支到它的新值”,但这是特别禁止和限制的。(它无论如何都不会检查 NULL 指针。)

于 2010-02-22T04:05:59.613 回答
2

PDP-11(大约 1970 年)比 Z-80 早了大约 5 年,并且至少某些型号(尽管可能不是早期型号)具有减一分支指令:

sob R, offset
于 2010-02-22T03:53:32.753 回答
2

一些 PIC 单片机(如 PIC18)具有 DECFSZ(递减文件,如果为零则跳过)指令。我经常放一个 DECFSZ 后跟分支。

于 2012-12-17T19:06:49.223 回答
1

在 x86 上,有一条 LOOP 指令做同样的事情(在 ECX 中有计数器)。还有 JECXZ 指令(如果 ECX 为零则跳转),该指令旨在与 LOOP 一起使用 - 将其放在循环之前,这样如果开始时计数为零,则可以跳过整个循环。

像这样:

  ;number of iterations in ECX
  JECXZ end
start:
  ;loop body
  LOOP start
end:

但请注意,这些指令在当代 CPU 上效率极低。使用常规 CMP/SUB 和 Jcc 指令要好得多。附带说明 - Intel Core2 CPU 实际上能够将比较+跳转指令对视为一条指令 - 他们称之为“宏操作融合”。

于 2010-03-15T17:16:21.663 回答
1

存在实际未使用的单指令集计算机。但是其中一种单指令集机器是“如果小于或等于零,则进行减法和分支”(subleq)机器。维基百科对此有更多了解

我不知道有任何其他真正的机器有这样的指令。我喜欢 RISC 机器,也确实没有必要使用它。

于 2010-02-22T03:32:04.780 回答
0

Z80 是 CISC 处理器。DJNZ 是复杂指令的经典示例。现代时尚倾向于 RISC 指令集,这些指令集更喜欢更小、更简单、更快的指令,但可以更快地处理它们——尤其是具有高级流水线功能。例如,我认为您不会在 ARM 家族中获得类似的东西。

于 2010-02-26T22:46:21.180 回答