2011-11-14 32 views
14

Disculpas por esta pregunta aparentemente menor, pero parece que no puedo encontrar la respuesta en ningún lado. Estoy empezando a implementar la instrucción DAA en mi emulador Z80, y en el manual de Zilog noté que es con el propósito de ajustar el acumulador para la aritmética decimal codificada en binario. Dice que la instrucción debe ejecutarse inmediatamente después de una instrucción de suma o resta.Z80 DAA instrucción

Mis preguntas son:

  • lo que ocurre si se ejecuta la instrucción tras otra?
  • ¿cómo sabe qué instrucción lo precedió?
  • Me doy cuenta de que está la bandera N - ¿pero esto seguramente no indicaría definitivamente que la instrucción anterior era una instrucción de suma o resta?
  • ¿Modifica el acumulador de todas formas, según las condiciones establecidas en la tabla DAA, independientemente de las instrucciones anteriores?

Respuesta

13

lo hace simplemente modificar el acumulador de todas formas, en función de las condiciones establecidas en la tabla DAA, independientemente de la instrucción anterior?

Sí. La documentación solo le dice para qué se pretende utilizar DAA. Tal vez usted se está refiriendo a la mesa en this link:

-------------------------------------------------------------------------------- 
|   | C Flag | HEX value in | H Flag | HEX value in | Number | C flag| 
| Operation | Before | upper digit | Before | lower digit | added | After | 
|   | DAA  | (bit 7-4) | DAA | (bit 3-0) | to byte | DAA | 
|------------------------------------------------------------------------------| 
|   | 0 |  0-9  | 0 |  0-9  | 00 | 0 | 
| ADD  | 0 |  0-8  | 0 |  A-F  | 06 | 0 | 
|   | 0 |  0-9  | 1 |  0-3  | 06 | 0 | 
| ADC  | 0 |  A-F  | 0 |  0-9  | 60 | 1 | 
|   | 0 |  9-F  | 0 |  A-F  | 66 | 1 | 
| INC  | 0 |  A-F  | 1 |  0-3  | 66 | 1 | 
|   | 1 |  0-2  | 0 |  0-9  | 60 | 1 | 
|   | 1 |  0-2  | 0 |  A-F  | 66 | 1 | 
|   | 1 |  0-3  | 1 |  0-3  | 66 | 1 | 
|------------------------------------------------------------------------------| 
| SUB  | 0 |  0-9  | 0 |  0-9  | 00 | 0 | 
| SBC  | 0 |  0-8  | 1 |  6-F  | FA | 0 | 
| DEC  | 1 |  7-F  | 0 |  0-9  | A0 | 1 | 
| NEG  | 1 |  6-F  | 1 |  6-F  | 9A | 1 | 
|------------------------------------------------------------------------------| 

debo decir que nunca he visto una especificación de instrucciones dafter. Si examina la tabla con cuidado, verá que el efecto de la instrucción depende únicamente de los indicadores C y H y del valor en el acumulador; no depende en absoluto de la instrucción anterior. Además, no divulga lo que sucede si, por ejemplo, C=0, H=1, y el dígito inferior en el acumulador es 4 o 5. Por lo tanto, deberá ejecutar un NOP en tales casos, o generar un mensaje de error, o algo .

+0

Muchas gracias - Espero no encontrar demasiadas instrucciones más ambiguas como esta :-) – PhilPotter1987

+1

El DAA de Z80 debe ser equivalente a DAA y DAS de x86 ya que tienen el mismo propósito. Echa un vistazo a las descripciones x86 de ambos. Hay algún tipo de DAA disponible en muchas CPU. –

+1

@Alex: los chips x86 tienen dos instrucciones de ajuste decimal: DAA (ajuste decimal después de la suma) y DAS (ajuste decimal después de la resta). La instrucción Z80 DAA los combina en uno, suponiendo que los operandos de la suma/resta más reciente eran números BCD válidos. – TonyK

8

Solo quería agregar que la bandera N es lo que significan cuando hablan de la operación anterior. Las adiciones establecidas N = 0, las restas establecidas N = 1. Por lo tanto, el contenido del registro A y las banderas C, H y N determinan el resultado.

La instrucción está pensada para admitir la aritmética de BCD, pero tiene otros usos. Considere este código:

and 15 
    add a,90h 
    daa 
    adc a,40h 
    daa 

Se termina la conversión de los 4 bits más bajos de un registro en los valores ASCII '0', '1', ... '9', 'A', 'B', .. ., 'F'. En otras palabras, un convertidor binario a hexadecimal.

8

Encontré esta instrucción bastante confusa también, pero encontré esta descripción de su comportamiento en z80-heaven para ser más útil.

Cuando se ejecuta esta instrucción, el registro A se corrige con BCD usando el contenido de las banderas. El proceso exacto es el siguiente: si los cuatro bits menos significativos de A contienen un dígito no BCD (es decir, es mayor que 9) o se establece el indicador H, entonces se agrega $ 06 al registro. Luego se verifican los cuatro bits más significativos. Si este dígito más significativo también es mayor que 9 o se establece el indicador C, entonces se agrega $ 60.

Esto proporciona un patrón simple para la instrucción:

  • si los 4 bits inferiores forman un número mayor que 9 o H se establece, agregar $ 06 al acumulador
  • si los 4 bits superiores formar un número mayor que 9 o C se establece, agregar $ 60 al acumulador

también, mientras DAA es destinados para ejecutarse después de una adición o sustracción, es puede ejecutar en cualquier momento.

+0

Parece que faltan las últimas cuatro operaciones (SUB, SBC, NEG y DEC). – Salgat

+3

@Salgat La misma regla se aplica cuando 'N = 1'. Lo único es que debe restar la corrección cuando 'N = 1'. – GabrielOshiro