在其他架构上等同于Z80 DJNZ指令?

时间:2010-02-22 03:20:24

标签: assembly instruction-set z80

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

9 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:3)

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

答案 2 :(得分:2)

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

等等

答案 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系列上没有这样的东西。