相当于其他架构上的 Z80 DJNZ 指令吗?
-
22-09-2019 - |
题
首先介绍一点背景。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 架构是否包含类似的控制指令?
解决方案
这是那个时代机器上相当常见的指令,并且也出现在许多其他地方。
- Corewar支持使用DJN指令和预减寻址模式.
- 同样地 m68k 支持具有预减寻址模式的 BNE.
- 极简主义 PDP-8也有类似的指令
ISZ - 递增操作数,如果结果为零则跳过。
等等
其他提示
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系列这样的事,例如。