首先介绍一点背景。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 架构是否包含类似的控制指令?

有帮助吗?

解决方案

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

等等

其他提示

Actualy在IA-32直接等效DJNZ是LOOPcc(LOOPZ)。记住Z80和8086具有相同的前身英特尔8080 。 因此,所有的x86 CPU直接继承DJNZ指令!

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

的PowerPC具有bdnz和一个特殊的递减计数寄存器ctr。递减ctr和有条件的分支是独立于实际情况的测试,这样你就可以bdnz,如bdnzlt cr5, label(如果没有记错)上添加一个条件将检查低于位存储在CR5和AND或或与的ctr成为0的条件。

讽刺的是,ctr也用来存储任何间接函数调用目的地。所以这是可能的代码指令“减量ctr并转移到其新的值,如果不为零”,但是这是明令禁止。 (这将不检查一个NULL指针反正。)有点显著,bdnz变成与间接调用的一个循环而没有用的。

一些PIC微控制器像PIC18具有DECFSZ(递减文件和跳过如果零)指令。我经常把一个DECFSZ随后分支。

有存在单个指令集计算机,这是不实际使用。但单指令集的机器中的一个是“比减去和分支如果小于或等于零”(subleq)机。 维基百科有更多关于这个

我不知道究竟有这样虽然指令的任何其他真正的机器。我喜欢RISC机器,实在看不出需要它的。

在PDP-11(约公元前1970年),通过5年左右的早于Z-80,和至少一些型号(尽管可能不是早期的)有一个的减一和转移的指令:

sob R, offset

在86有LOOP指令,做同样的事情(用ECX计数器)。也有JECXZ指令(跳转如果ECX是零),其意在与LOOP一起使用 - 你把它在循环之前,这样就可以跳过整个循环如果计数是在开始零

像这样:

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

但请注意,这些指令是当代的CPU效率极其低下。这是更好的使用正则CMP / SUB和JCC指令。在一个侧面说明 - 英特尔酷睿2的CPU实际上能够治疗比较+跳转指令对,就好像它是一个单一的指令 - 他们称之为“宏指令融合”

在Z80是一个CISC处理器。 DJNZ是一个复杂的指令的一个典型的例子。现代时尚是迈向RISC指令集,其更喜欢更小,更简单,更快速的指令,但可以更快地处理他们 - 尤其是先进的流水线功能。我不认为你上了ARM系列这样的事,例如。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top