Equivalents bis Z80 DJNZ Anweisung auf andere Architekturen?
-
22-09-2019 - |
Frage
Zuerst ein wenig Hintergrund. Die Z80 CPU hat einen Befehl namens DJNZ , die in ähnlicher Weise verwendet werden können, als for
Schleife. Grundsätzlich DJNZ dekrementiert das B-Register, und springt zu einem Etikett, wenn nicht Null. Zum Beispiel:
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
Natürlich können Sie das gleiche tun Anweisungen mit regulärer Vergleich und springen, aber oft ist es praktisch, um den einzelnen Befehl zu verwenden.
Mit diesem aus dem Weg, meine Frage ist, haben andere CPU-Architekturen enthalten einen ähnlichen Steuerbefehl?
Lösung
Das war eine ziemlich allgemeine Anweisung auf Maschinen der damaligen Zeit, und tritt in vielen anderen Orten auch.
- Corewar unterstützt es den DJN Befehl mit der Pre-Dekrement-Adressiermodus verwenden.
- Ebenso die m68k Stützen BNE mit einem Pre-Dekrement Adressieren Modus .
- Die minimalistische PDP-8 hat eine ähnliche Anweisung
ISZ -. Schritt Operanden und überspringt, wenn das Ergebnis Null ist
Und so weiter
Andere Tipps
Actualy in IA-32 direkte Entsprechung für DJNZ ist LOOPcc (LOOPZ). Denken Sie an die Z80 und 8086 haben die gleichen Vorgänger Intel 8080 . So alle x86-CPUs direkt vererben DJNZ Anweisung!
IA-32 verfügt über verschiedene REP*
Anweisungen, die CX als Zähler verwendet werden
PowerPC hat bdnz
und ein spezielles Countdown-Register ctr
. ctr
Erniedrigen und bedingt Verzweigung ist unabhängig vom tatsächlichen Zustand Test, so dass Sie eine Bedingung auf den bdnz
hinzufügen können, zB bdnzlt cr5, label
prüfen (wenn der Speicher dient), wenn das weniger als Bit in cr5 gespeichert und entweder AND oder OR, dass mit der Zustand von ctr
0 werden.
Ironischerweise ist ctr
auch jedes indirektes Funktion Anrufziel zu speichern, verwendet. So ist es die Anweisung „Dekrement ctr
und Zweig auf den neuen Wert, wenn nicht Null“, um Code möglich ist, aber dies ist ausdrücklich verboten. (Es wäre nicht für einen NULL-Zeiger überprüft sowieso.) Etwas deutlich, bdnz
wird ziemlich nutzlos in einer Schleife mit einem indirekten Aufruf.
Einige PIC-Mikrocontroller wie die PIC18 haben eine DECFSZ (Decrement Datei und Überspringen, wenn Null) Anweisung. Ich habe put oft ein DECFSZ gefolgt von Zweig.
Es existieren einzelne Befehlssatz-Computer, die nicht tatsächlich verwendet wird. Aber eine der einzelnen Maschinen-Befehlssatz ist der „subtrahieren und Zweig, wenn weniger als oder gleich Null“ (subleq
) Maschine. Wikipedia hat mehr auf dieser
Ich bin nicht bekannt, dass andere realen Maschinen, die eine Anweisung genau wie dieses though. I wie RISC-Maschinen, und wirklich keine Notwendigkeit dafür sieht auch nicht.
Die PDP-11 (circa 1970) datierte die Z-80 um etwa 5 Jahre und zumindest einige Modelle (wenn auch wahrscheinlich nicht die erste ist) hatten eine subtrahieren-one-and-Zweig Anweisung:
sob R, offset
Auf x86 gibt es den LOOP-Befehl, die genau tut die gleiche Sache (mit Zählern in ECX). Es gibt auch den jecxz Befehl (Sprung, wenn ECX Null ist), die mit LOOP zusammen gemeint ist, verwendet werden - Sie legen Sie sie vor der Schleife, so dass Sie die gesamte Schleife überspringen, wenn die Zählung Null am Anfang ist
.Wie folgt aus:
;number of iterations in ECX
JECXZ end
start:
;loop body
LOOP start
end:
Aber beachten Sie, dass diese Anweisungen schrecklich ineffizient sind auf zeitgenössischen CPUs. Es ist viel besser zu regelmäßigen CMP / SUB und Jcc Anweisungen zu verwenden. Auf einer seitlichen Anmerkung - die Intel Core2-CPUs sind tatsächlich in der Lage eine vergleichen + Sprungbefehl Paar zu behandeln, als ob es sich um eine einzelne Anweisung waren - sie nennen es „Makro-op-Fusion“
.Der Z80 war ein CISC-Prozessor. DJNZ ist ein klassisches Beispiel für eine komplexe Anweisung. Die moderne Art und Weise ist auf RISC-Befehlssätzen, die es vorziehen, kleine, einfacher, schnelle Anweisungen, sondern können sie schneller verarbeiten - vor allem mit erweiterten Pipelining-Funktionen. Ich glaube nicht, dass du so etwas auf der ARM-Familie erhalten, zum Beispiel.