Domanda

Prima un po 'di storia. La CPU Z80 ha un'istruzione chiamato DJNZ che può essere utilizzato in modo analogo come un ciclo for. Fondamentalmente DJNZ decrementa il registro B e salta ad un'etichetta se non nullo. Ad esempio:

    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 

Naturalmente si può fare la stessa cosa usando istruzioni di confronto e di salto regolari, ma spesso è comodo per utilizzare la singola istruzione.

Con quella di mezzo, la mia domanda è, fare altre architetture di CPU comprendono un'istruzione di controllo simile?

È stato utile?

Soluzione

E 'stata un'istruzione abbastanza comune sulle macchine di quel periodo, e si verifica in molti altri luoghi.

E così via

Altri suggerimenti

actualy in IA-32 diretto equivalente per DJNZ è LOOPcc (Loopz). Ricordate la Z80 e 8086 hanno lo stesso predecessore Intel 8080 . Quindi, tutte le CPU x86 ereditano direttamente istruzioni DJNZ!

IA-32 presenta varie istruzioni REP* che utilizzano CX come loro contatore

PowerPC ha bdnz e uno speciale conto alla rovescia registro ctr. Decremento ctr e condizionatamente ramificazione è indipendente dalla condizione di test vero e proprio, in modo da poter aggiungere una condizione in cima bdnz, ad esempio bdnzlt cr5, label (se la memoria non serve) controllerà se il minore di bit memorizzati in CR5 e sia AND o OR che con il condizione di diventare ctr 0.

Per ironia della sorte, ctr viene utilizzato anche per memorizzare qualsiasi destinazione indiretta funzione di chiamata. Quindi è possibile codificare l'istruzione "decremento ctr e il ramo per il suo nuovo valore, se non zero", ma questo è specificamente vietato. (Non sarebbe verificare la presenza di un puntatore NULL in ogni caso.) Un po 'in modo significativo, bdnz diventa piuttosto inutile in un ciclo con una chiamata indiretta.

Alcuni microcontrollori PIC come il PIC18 hanno un DECFSZ (file Decremento e saltare se Zero) istruzioni. Spesso ho messo un DECFSZ seguito da ramo.

Esistono computer set di istruzioni singole, che non vengono effettivamente utilizzati. Ma una delle macchine singole set di istruzioni è il "sottrarre e ramo se minore o uguale a zero" (subleq) Macchina. Wikipedia ha più su questo

Io non sono a conoscenza di altre macchine reali che hanno un'istruzione esattamente come questo però. Mi piace macchine RISC, e davvero non vedo la necessità di esso sia.

Il PDP-11 (circa 1970) ha preceduto i modelli Z-80 per circa 5 anni, e almeno alcuni (anche se probabilmente non i primi quelli) hanno avuto un sottrarre-one-and-ramo istruzioni:

sob R, offset

Il 86 non v'è l'istruzione LOOP che fa esattamente la stessa cosa (con il contatore in ECX). C'è anche l'istruzione JECXZ (Vai se ECX è pari a zero), che è destinato a essere utilizzato insieme a LOOP -. Si posiziona prima del ciclo in modo che si può saltare l'intero ciclo se il conteggio è stato pari a zero nel principio

In questo modo:

  ;number of iterations in ECX
  JECXZ end
start:
  ;loop body
  LOOP start
end:

Ma notare che queste istruzioni sono terribilmente inefficiente sulle CPU contemporanei. E 'molto meglio usare normale CMP / SUB e le istruzioni del CCM. Su un lato nota - il Core 2 CPU Intel sono in realtà in grado di trattare un confrontare + istruzione di salto coppia come se si trattasse di una singola istruzione - lo chiamano "macro-op fusion"

.

La Z80 è stata un processore CISC. DJNZ è un classico esempio di un'istruzione complessa. La moda moderna è verso i set di istruzioni RISC che preferiscono più piccole, più semplici, più veloci le istruzioni, ma in grado di elaborarli in modo più rapido - in particolare con funzioni avanzate pipelining. Non credo che si ottiene qualcosa di simile sulla famiglia ARM, per esempio.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top