首先是一点背景。 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架构是否包含类似的控制指令?
答案 0 :(得分:6)
Actualy在IA-32中直接相当于DJNZ的是LOOPcc(LOOPZ)。请记住,Z80和8086具有相同的前身Intel 8080。 所以所有x86 CPU都直接继承了DJNZ指令!
答案 1 :(得分:3)
IA-32有各种REP*
指令,它们使用CX作为其计数器
答案 2 :(得分:2)
在那个时代的机器上,这是一个相当普遍的指令,并且也出现在许多其他地方。
ISZ - 增加操作数,如果结果为零则跳过。
等等
答案 3 :(得分:2)
PowerPC有bdnz
个特殊倒计时注册ctr
。递减ctr
和有条件分支与实际条件测试无关,因此您可以在bdnz
之上添加条件,例如bdnzlt cr5, label
(如果内存服务)将检查是否小于存储在cr5中的位和AND或OR,条件ctr
变为0。
具有讽刺意味的是,ctr
也用于存储任何间接函数调用目标。所以可以编写指令“递减ctr
并且如果不是零则分支到它的新值”,但这是特别禁止的。 (它无论如何都不会检查NULL指针。)有些显着,bdnz
在带间接调用的循环中变得毫无用处。
答案 4 :(得分:2)
某些PIC单片机(如PIC18)具有DECFSZ(递减文件和跳过,如果为零)指令。我经常把DECFSZ放在分支上。
答案 5 :(得分:1)
存在单个指令集计算机,它们实际上没有使用。但是其中一个单指令集机器是“减去和分支,如果小于或等于零”(subleq
)机器。 Wikipedia has more on this
我不知道有任何其他真正的机器具有完全相同的指令。我喜欢RISC机器,实际上也不需要它。
答案 6 :(得分:1)
PDP-11(大约1970年)比Z-80早了大约5年,至少有些模型(虽然可能不是早期的模型)有减去一分支指令:
sob R, offset
答案 7 :(得分:1)
在x86上有一个LOOP指令执行完全相同的操作(在ECX中使用计数器)。还有JECXZ指令(如果ECX为零则跳转),它与LOOP一起使用 - 在循环之前放置它,这样如果计数在开始时为零,则可以跳过整个循环。
像这样:
;number of iterations in ECX
JECXZ end
start:
;loop body
LOOP start
end:
但请注意,这些指令在当代CPU上非常低效。使用常规CMP / SUB和Jcc指令要好得多。另外一点 - 英特尔酷睿2 CPU实际上能够将比较+跳转指令对视为单指令 - 他们称之为“宏操作融合”。
答案 8 :(得分:0)
Z80是CISC处理器。 DJNZ是复杂教学的典型例子。现代时尚面向RISC指令集,它更喜欢更小,更简单,更快速的指令,但可以更快地处理它们 - 特别是使用高级流水线功能。例如,我认为你在ARM系列上没有这样的东西。