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 [19-01-2024 10:13] – [Desplazamiento de bits] sromerocursos:ensamblador:lenguaje_2 [26-03-2024 08:13] (actual) – [Desplazamiento de bits] sromero
Línea 10: Línea 10:
 Para poder continuar con éste y posteriores capítulos del curso será imprescindible haber comprendido y asimilado todos los conocimientos de las entregas anteriores, de modo que si no es así, recomendamos al lector que relea las entregas 1, 2 y 3, y que se asegure de comprender todos los conceptos explicados. Para poder continuar con éste y posteriores capítulos del curso será imprescindible haber comprendido y asimilado todos los conocimientos de las entregas anteriores, de modo que si no es así, recomendamos al lector que relea las entregas 1, 2 y 3, y que se asegure de comprender todos los conceptos explicados.
  
-En esta entrega trataremos las operaciones con bits (''NEG'', ''CPL'', ''BIT'', ''SET'' y ''RES''), las operaciones lógicas (''AND'', ''OR'' y ''XOR'') y las operaciones de desplazamiento de bits (''RR'', ''RL'', ''RLC'', ''RRC'', ''SLA'', ''SRA'' ''SRL'').+En esta entrega trataremos las operaciones con bits (''NEG'', ''CPL'', ''BIT'', ''SET'' y ''RES''), las operaciones lógicas (''AND'', ''OR'' y ''XOR'') y las operaciones de desplazamiento de bits (''RR'', ''RL'', ''RLC'', ''RRC'', ''SLA'', ''SRA''''SRL'' y ''SLI'').
  
 No obstante, antes de pasar a hablar de las operaciones con bits finalizaremos con la descripción de las instrucciones de carga (en este caso las repetitivas), y veremos 4 instrucciones muy sencillas: ''SCF'', ''CCF'', ''NOP'' y ''DAA''. No obstante, antes de pasar a hablar de las operaciones con bits finalizaremos con la descripción de las instrucciones de carga (en este caso las repetitivas), y veremos 4 instrucciones muy sencillas: ''SCF'', ''CCF'', ''NOP'' y ''DAA''.
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|
Línea 959: Línea 959:
 ------------- -------------
 |* * 0 P 0 *|</code> | |* * 0 P 0 *|</code> |
-| **SLL** | **Shift Left Logical**\\ Desplaza el registro o dato en un bit a la izquierda.\\ Introduce un 1 por la derecha (bit 0).\\ El bit saliente (bit 7) se copia al CF. | <code> C    7 6 5 4 3 2 1 0        C    7 6 5 4 3 2 1 0+| **SLI** | **Shift Left And Increment**\\ Desplaza el registro o dato en un bit a la izquierda.\\ Introduce un 1 por la derecha (bit 0).\\ El bit saliente (bit 7) se copia al CF. | <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 0</code> | <code>|S Z H P N C|+    a b c d e f g h   =>      b c d e f g h 1</code> | <code>|S Z H P N C|
 ------------- -------------
 |* * 0 P 0 *|</code> | |* * 0 P 0 *|</code> |
Línea 1018: Línea 1018:
   rrd               |* * 0 P 0 -|         Rotate Right 4 bits   rrd               |* * 0 P 0 -|         Rotate Right 4 bits
 </code> </code>
 +
 +A continuación podemos ver un resumen gráfico de las diferentes instrucciones de desplazamiento obtenido del libro "//Inside your Spectrum//", de //Jeff Naylor// y //Diane Rogers//, al cual se le ha añadido la instrucción ''SLI'' (también conocida como ''SL1'' la cual no está contemplada en el libro):
 +
 +\\ 
 +{{ :cursos:ensamblador:resumen-instrucciones-rotacion-y-desplazamiento.jpg }}
 +\\ 
  
 \\  \\ 
  • cursos/ensamblador/lenguaje_2.1705659231.txt.gz
  • Última modificación: 19-01-2024 10:13
  • por sromero