cursos:ensamblador:lenguaje_2

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Ambos lados, revisión anterior Revisión previa
Próxima revisión
Revisión previa
cursos:ensamblador:lenguaje_2 [20-01-2024 20:09] – [Resumen de instrucciones de rotación y desplazamiento] sromerocursos:ensamblador:lenguaje_2 [26-03-2024 08:13] (actual) – [Desplazamiento de bits] sromero
Línea 239: Línea 239:
     * ''scf'': **Set Carry Flag** : Esta instrucción (que no admite parámetros) pone a 1 el Carry Flag del registro F. Puede sernos útil en determinadas operaciones aritméticas.     * ''scf'': **Set Carry Flag** : Esta instrucción (que no admite parámetros) pone a 1 el Carry Flag del registro F. Puede sernos útil en determinadas operaciones aritméticas.
  
-    * ''ccf'': **Complement Carry Flag** : Esta instrucción (que tampoco admite parámetros) invierte el estado del bit de Carry Flag: si está a 1 lo pone a 0, y viceversa. Puede servirnos para poner a 0 el carry flag mediante la combinación de scf + ccf, aunque esta misma operación se puede realizar con un simple ''and a''.+    * ''ccf'': **Complement Carry Flag** : Esta instrucción (que tampoco admite parámetros) invierte el estado del bit de Carry Flag: si está a 1 lo pone a 0, y viceversa. Puede servirnos para poner a 0 el carry flag mediante la combinación de ''scf'' ''ccf'', aunque esta misma operación se puede realizar con un simple ''and a'' u ''or a''.
  
     * ''nop'': **No OPeration** :  Esta instrucción especial del microprocesador ocupa un byte en el código (opcode $00) y no efectúa ninguna operación ni afecta a ningún flag. En cambio, se toma 4 t-states (t-estados, o ciclos del procesador) para ejecutarse, debido al ciclo de fetch/decode/execute del procesador. ¿Para qué puede servir una instrucción que no realiza ninguna acción y que requiere tiempo del procesador (aunque sea muy poco) para ejecutarse? Por un lado, podemos utilizarla en bucles de retardos (varios ''NOP''s ejecutados en un bucle que se repita varias veces) para poner retardos en nuestros programas o juegos. Por otro, como ocupa un byte en memoria (en el código) y no realiza ninguna operación, podemos utilizarla para rellenar zonas de nuestro código, y así alinear código posterior en una determinada dirección que nos interese.     * ''nop'': **No OPeration** :  Esta instrucción especial del microprocesador ocupa un byte en el código (opcode $00) y no efectúa ninguna operación ni afecta a ningún flag. En cambio, se toma 4 t-states (t-estados, o ciclos del procesador) para ejecutarse, debido al ciclo de fetch/decode/execute del procesador. ¿Para qué puede servir una instrucción que no realiza ninguna acción y que requiere tiempo del procesador (aunque sea muy poco) para ejecutarse? Por un lado, podemos utilizarla en bucles de retardos (varios ''NOP''s ejecutados en un bucle que se repita varias veces) para poner retardos en nuestros programas o juegos. Por otro, como ocupa un byte en memoria (en el código) y no realiza ninguna operación, podemos utilizarla para rellenar zonas de nuestro código, y así alinear código posterior en una determinada dirección que nos interese.
Línea 781: Línea 781:
 \\  \\ 
  
- No existe una instrucción ''SLL'' ("Shift Left Logical") porque literalmente sería lo mismo que ''SLA'', de modo que no hay un mnemónico para ella.+ No existe una instrucción oficial ''SLL'' ("Shift Left Logical") porque literalmente sería lo mismo que ''SLA'', aunque existen como instrucciones no documentadas, desde **$CB $30** hasta **$CB $37** (actuando respectivamente sobre los registros B, C, D, E, H, L, (HL) y A), así como variantes con (IX/IY+d).
  
  Finalmente, se da la curiosidad de que existe una serie de opcodes que no están documentados en el manual de Z80 y que dan lugar a una operación de desplazamiento nueva llamada ''SLI'' ("Shift Left And Increment") o ''SL1'' (según el ensamblador que utilicemos):  Finalmente, se da la curiosidad de que existe una serie de opcodes que no están documentados en el manual de Z80 y que dan lugar a una operación de desplazamiento nueva llamada ''SLI'' ("Shift Left And Increment") o ''SL1'' (según el ensamblador que utilicemos):
Línea 924: Línea 924:
 ------------- -------------
 |* * 0 P 0 *|</code> | |* * 0 P 0 *|</code> |
-| **rlca** | **Rotate Left Circular Accumulator**\\ Rota el registro A en un bit a la izquierda.\\ Igual que **RLC** pero con diferente afectación de Flags.\\ El CF no entra en el registro.\\ El CF se ve afectado: CF = copia del bit 7 | <code> C    7 6 5 4 3 2 1 0        C    7 6 5 4 3 2 1 0+| **RLCA** | **Rotate Left Circular Accumulator**\\ Rota el registro A en un bit a la izquierda.\\ Igual que **RLC** pero con diferente afectación de Flags.\\ El CF no entra en el registro.\\ El CF se ve afectado: CF = copia del bit 7 | <code> C    7 6 5 4 3 2 1 0        C    7 6 5 4 3 2 1 0
 ----------------------      ---------------------- ----------------------      ----------------------
     a b c d e f g h   =>      b c d e f g h a</code> | <code>|S Z H P N C|     a b c d e f g h   =>      b c d e f g h a</code> | <code>|S Z H P N C|
 ------------- -------------
 |- - 0 - 0 *|</code> | |- - 0 - 0 *|</code> |
-| **rrca** | **Rotate Right Circular Accumulator**\\ Rota el registro A en un bit a la derecha.\\ Igual que **RRC** pero con diferente afectación de Flags.\\ No interviene el CF. \\ El CF se ve afectado: CF = copia del bit 0 | <code> C    7 6 5 4 3 2 1 0        C    7 6 5 4 3 2 1 0+| **RRCA** | **Rotate Right Circular Accumulator**\\ Rota el registro A en un bit a la derecha.\\ Igual que **RRC** pero con diferente afectación de Flags.\\ No interviene el CF. \\ El CF se ve afectado: CF = copia del bit 0 | <code> C    7 6 5 4 3 2 1 0        C    7 6 5 4 3 2 1 0
 ----------------------      ---------------------- ----------------------      ----------------------
     a b c d e f g h   =>      h a b c d e f g</code> | <code>|S Z H P N C|     a b c d e f g h   =>      h a b c d e f g</code> | <code>|S Z H P N C|
 ------------- -------------
 |- - 0 - 0 *|</code> | |- - 0 - 0 *|</code> |
-| **rla** | **Rotate Left Accumulator**\\ Rota el registro Aen un bit a la izquierda.\\ Igual que **RL** pero con diferente afectación de Flags.\\ El CF es un bit más (el 8) del registro.\\ Inserta el CF en el bit 0.\\ El CF se ve afectado: CF = valor del bit 7 | <code> C    7 6 5 4 3 2 1 0        C    7 6 5 4 3 2 1 0+| **RLA** | **Rotate Left Accumulator**\\ Rota el registro Aen un bit a la izquierda.\\ Igual que **RL** pero con diferente afectación de Flags.\\ El CF es un bit más (el 8) del registro.\\ Inserta el CF en el bit 0.\\ El CF se ve afectado: CF = valor del bit 7 | <code> C    7 6 5 4 3 2 1 0        C    7 6 5 4 3 2 1 0
 ----------------------      ---------------------- ----------------------      ----------------------
     a b c d e f g h   =>      b c d e f g h X</code> | <code>|S Z H P N C|     a b c d e f g h   =>      b c d e f g h X</code> | <code>|S Z H P N C|
 ------------- -------------
 |- - 0 - 0 *|</code> | |- - 0 - 0 *|</code> |
-| **rra** | **Rotate Right Accumulator**\\ Rota el registro A en un bit a la derecha.\\ Igual que **RR** pero con diferente afectación de Flags.\\ El CF es un bit más (el 8) del registro.\\ Inserta el CF en el bit 0. \\ El CF se ve afectado: CF = valor del bit 0 | <code> C    7 6 5 4 3 2 1 0        C    7 6 5 4 3 2 1 0+| **RRA** | **Rotate Right Accumulator**\\ Rota el registro A en un bit a la derecha.\\ Igual que **RR** pero con diferente afectación de Flags.\\ El CF es un bit más (el 8) del registro.\\ Inserta el CF en el bit 0. \\ El CF se ve afectado: CF = valor del bit 0 | <code> C    7 6 5 4 3 2 1 0        C    7 6 5 4 3 2 1 0
 ----------------------      ---------------------- ----------------------      ----------------------
     a b c d e f g h   =>      X a b c d e f g </code> | <code>|S Z H P N C|     a b c d e f g h   =>      X a b c d e f g </code> | <code>|S Z H P N C|
  • cursos/ensamblador/lenguaje_2.1705781352.txt.gz
  • Última modificación: 20-01-2024 20:09
  • por sromero