Question

D'abord un peu de fond. La CPU z80 a une instruction appelée djnz qui peut être utilisé de manière similaire comme une boucle de for. Fondamentalement djnz décrémente le registre B et saute à une étiquette sinon nulle. Par exemple:

    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 

Bien sûr, vous pouvez faire la même chose en utilisant des instructions de comparaison et de sauter régulièrement, mais souvent il est pratique d'utiliser l'instruction unique.

Avec cela du chemin, ma question est, ce que d'autres architectures CPU comprennent une instruction de contrôle semblable?

Était-ce utile?

La solution

C'était une instruction assez commun sur les machines de cette époque, et se produit dans de nombreux autres endroits.

Et ainsi de suite

Autres conseils

actuellement en IA-32 équivalent direct pour djnz est LOOPcc (LOOPZ). Rappelez-vous le Z80 et 8086 ont le même prédécesseur Intel 8080 . Donc, tous les processeurs x86 héritent directement instruction djnz!

IA-32 a différentes instructions de REP* qui utilisent CX que sa contre-

PowerPC a bdnz et un registre décompte spécial ctr. Décrémentation ctr et branchement conditionnel est indépendant du test de condition réelle, de sorte que vous pouvez ajouter une condition au-dessus de bdnz, par exemple bdnzlt cr5, label (si ma mémoire est bonne) vérifiera si le moins de bits stockés dans CR5 et AND ou OR que la état de ctr devient 0.

Ironie du sort, ctr est également utilisé pour stocker une destination d'appel de fonction indirecte. Il est donc possible de coder l'instruction « ctr décrément et la branche à sa nouvelle valeur sinon zéro », mais cela est spécifiquement interdit. (Il ne vérifierait pas un pointeur NULL de toute façon.) Un peu significative, bdnz devient plutôt inutile dans une boucle avec un appel indirect.

Certains microcontrôleurs PIC comme PIC18 ont un DECFSZ (fichier Décrémenter et Ignorer si zéro) instruction. Je l'ai souvent mis un DECFSZ suivi par branche.

Il existe des ordinateurs jeu d'instructions qui ne sont pas réellement utilisés. Mais l'une des machines de jeu d'instructions est le « soustraire et branche si elle est inférieure ou égale à zéro » machine (subleq). Wikipedia a plus sur cette

Je ne suis pas au courant d'autres machines réelles qui ont une instruction exactement comme si cela. J'aime les machines RISC, et ne vois vraiment pas besoin non plus.

Le PDP-11 (vers 1970) précédait les Z-80 par environ 5 ans, et au moins certains modèles (mais probablement pas les premiers) avaient soustraire-one-et-branche instruction:

sob R, offset

Sur x86 il y a l'instruction de boucle qui fait exactement la même chose (avec comptoir en ECX). Il y a aussi l'instruction JECXZ (Aller si ECX est égal à zéro) qui est destiné à être utilisé conjointement avec LOOP -. Vous placez avant la boucle de sorte que vous pouvez sauter la boucle entière si le compte était égal à zéro au début

Comme ceci:

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

Mais notez que ces instructions sont horriblement inefficace sur les processeurs contemporains. Il est préférable d'utiliser régulièrement CMP / SUB et instructions Jcc. Sur une note côté - les CPU Intel Core2 sont réellement en mesure de traiter une comparaison + paire instruction de saut comme si elle était une seule instruction - ils l'appellent « fusion macro-op »

.

Le Z80 est un processeur CISC. Djnz est un exemple classique d'une instruction complexe. La mode moderne vers les jeux d'instructions RISC qui préfèrent plus petits, plus simples, plus rapides, mais les instructions peuvent les traiter plus rapidement - en particulier avec des fonctionnalités avancées de pipelining. Je ne pense pas que vous obtenez quelque chose comme ça sur la famille ARM, par exemple.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top