Pregunta

Primero un poco de historia. La CPU z80 tiene una instrucción llamado DJNZ que puede ser utilizado de una manera similar como un bucle for. Básicamente DJNZ disminuye el registro B y salta a una etiqueta si no es cero. Por ejemplo:

    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 

Por supuesto que puede hacer lo mismo usando instrucciones de comparación y salto regulares, pero a menudo es práctico el uso de la instrucción individual.

Con eso fuera del camino, mi pregunta es, qué otras arquitecturas de CPU incluye una instrucción de control similar?

¿Fue útil?

Solución

Eso era una instrucción bastante común en las máquinas de la época, y ocurre en muchos otros lugares también.

Y así sucesivamente

Otros consejos

actualy en IA-32 equivalente directo para DJNZ es LOOPcc (LOOPZ). Recuerde que el Z80 y 8086 tienen el mismo predecesor Intel 8080 . Así que todas las CPU x86 directamente heredan de instrucciones DJNZ!

IA-32 tiene diversas instrucciones REP* que utilizan CX como su contador

PowerPC tiene bdnz y una ctr registro especial de cuenta atrás. Decrementar ctr y condicionalmente ramificación es independiente de la condición de prueba real, por lo que puede agregar una condición en la parte superior de bdnz, por ejemplo bdnzlt cr5, label (si mal no recuerdo) comprobará si el menos-que poco almacena en CR5 y AND u OR que con la condición de ctr convertirse en 0.

Irónicamente, ctr también se utiliza para almacenar cualquier destino de la llamada función indirecta. Por lo que es posible codificar la instrucción "ctr decremento y la rama a su nuevo valor si no es cero", pero esto está expresamente prohibido. (No sería comprobar si hay un puntero NULL de todos modos.) Poco significativamente, bdnz convierte en algo inútil en un bucle con una llamada indirecta.

Algunos microcontroladores PIC como el PIC18 tienen una instrucción DECFSZ (Saltar si Cero decremento de archivos y). He menudo poner un DECFSZ seguido por rama.

No existe ordenadores del conjunto de instrucciones sencillas, que no se utilizan en realidad. Pero una de las máquinas del conjunto de instrucciones individuales es la "rama de restar y si es menor o igual a cero" máquina (subleq). Wikipedia tiene más información sobre este

No estoy al tanto de cualquier otra máquina reales que tienen una instrucción exactamente igual que esto, sin embargo. Yo como máquinas RISC, y realmente no veo la necesidad de que tampoco.

El PDP-11 (alrededor de 1970) es anterior a la Z-80 por cerca de 5 años, y al menos algunos modelos (aunque probablemente no en las primeras) tenía un restar uno y ramas instrucciones:

sob R, offset

En x86 existe la instrucción de bucle que hace exactamente lo mismo (con el contador en ECX). También existe la instrucción JECXZ (Saltar si ECX es cero) que está destinado a ser utilizado junto con LOOP - lo coloca antes del bucle de manera que puede saltarse todo el bucle si el recuento era cero en el inicio

.

De esta manera:

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

Pero tenga en cuenta que estas instrucciones son terriblemente ineficientes en las CPU contemporáneos. Es mucho mejor usar regularmente CMP / SUB y las instrucciones del CCM. En una nota lateral - la CPU Intel Core 2 son realmente capaces de tratar a un par instrucción de comparación + salto como si fuera una sola instrucción - lo llaman "fusión macro-op"

.

El Z80 era un procesador CISC. DJNZ es un ejemplo clásico de una instrucción compleja. La moda actual es hacia conjuntos de instrucciones RISC, que prefieren más pequeños, instrucciones simples, pero más rápidos pueden procesar más rápidamente - especialmente con características avanzadas pipelining. No creo que usted consigue algo como esto en la familia ARM, por ejemplo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top