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?

War es hilfreich?

Lösung

Das war eine ziemlich allgemeine Anweisung auf Maschinen der damaligen Zeit, und tritt in vielen anderen Orten auch.

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top