Diferencias
Muestra las diferencias entre dos versiones de la página.
Ambos lados, revisión anterior Revisión previa Próxima revisión | Revisión previa | ||
cursos:ensamblador:lenguaje_3 [19-01-2024 06:48] – sromero | cursos:ensamblador:lenguaje_3 [19-01-2024 07:14] (actual) – sromero | ||
---|---|---|---|
Línea 4: | Línea 4: | ||
===== Instrucciones condicionales, | ===== Instrucciones condicionales, | ||
- | Una vez hemos visto la mayoría de instrucciones aritméticas y lógicas, es el momento de utilizarlas como condicionales para realizar cambios en el flujo lineal de nuestro programa. En esta entrega aprenderemos a usar etiquetas y saltos mediante instrucciones condicionales ('' | + | Una vez hemos visto la mayoría de instrucciones aritméticas y lógicas, es el momento de utilizarlas como condicionales para realizar cambios en el flujo lineal de nuestro programa. En esta entrega aprenderemos a usar etiquetas y saltos mediante instrucciones condicionales ('' |
Línea 590: | Línea 590: | ||
===== Saltos condicionales con los flags ===== | ===== Saltos condicionales con los flags ===== | ||
- | Ya hemos visto la forma de realizar saltos incondicionales. A continuación veremos cómo realizar los saltos (ya sean absolutos con '' | + | Ya hemos visto la forma de realizar saltos incondicionales. A continuación veremos cómo realizar los saltos (ya sean absolutos con '' |
Las instrucciones condicionales disponibles trabajan con el estado de los flags del registro F, y son: | Las instrucciones condicionales disponibles trabajan con el estado de los flags del registro F, y son: | ||
Línea 653: | Línea 653: | ||
nop | nop | ||
- | dec a ; Decrementamos A. | + | dec a |
- | | + | ; Cuando A sea cero, Z se pondrá a 1 |
- | jr nz, bucle | + | jr nz, bucle ; Mientras Z=0, repetir el bucle |
+ | |||
+ | ld a, 200 ; Aquí llegaremos cuando Z sea 1 (A valga 0) | ||
- | ld a, 200 ; Aquí llegaremos cuando Z sea 1 (A valga 0) | ||
; resto del programa | ; resto del programa | ||
</ | </ | ||
Línea 679: | Línea 680: | ||
<code z80> | <code z80> | ||
- | sub b ; A = A-B | + | sub b ; A = A-B |
- | jr z, iguales | + | jr z, iguales |
- | jr nz, distintos | + | jr nz, distintos |
iguales: | iguales: | ||
Línea 689: | Línea 690: | ||
distintos: | distintos: | ||
;;; (código) | ;;; (código) | ||
- | ;jr seguir | + | ;jr seguir |
- | | + | |
seguir: | seguir: | ||
Línea 698: | Línea 699: | ||
<code z80> | <code z80> | ||
- | sub b ; A = A-B | + | sub b ; A = A-B |
- | jr nz, distintos | + | jr nz, distintos |
- | | + | |
iguales: | iguales: | ||
Línea 707: | Línea 708: | ||
distintos: | distintos: | ||
- | ;;; (código) | + | ;;; (código) |
seguir: | seguir: | ||
Línea 774: | Línea 775: | ||
<code z80> | <code z80> | ||
- | CP origen | + | cp origen |
</ | </ | ||
Línea 784: | Línea 785: | ||
<code z80> | <code z80> | ||
- | sub b ; A = A-B | + | sub b ; A = A-B |
- | jr z, iguales | + | jr z, iguales |
- | jr nz, distintos | + | jr nz, distintos |
</ | </ | ||
Línea 792: | Línea 793: | ||
<code z80> | <code z80> | ||
- | cp b | + | cp b |
- | jr z, iguales | + | jr z, iguales |
- | jr nz, distintos | + | jr nz, distintos |
</ | </ | ||
Línea 831: | Línea 832: | ||
ld c, 6 | ld c, 6 | ||
- | cp b ; IF A==B | + | cp b ; IF A==B |
- | jr z, A_Igual_a_B | + | jr z, A_Igual_a_B |
- | cp c ; IF A==C | + | cp c ; IF A==C |
- | jr z, A_Igual_a_C | + | jr z, A_Igual_a_C |
- | jp Fin ; si no, salimos | + | jp Fin ; si no, salimos |
A_Igual_a_B: | A_Igual_a_B: | ||
Línea 854: | Línea 855: | ||
| | ||
| | ||
- | |CP s |* * * V 1 *| | + | |cp s |* * * V 1 *| |
</ | </ | ||
Línea 874: | Línea 875: | ||
cp e | cp e | ||
jr nz, no_iguales | jr nz, no_iguales | ||
+ | |||
iguales: | iguales: | ||
;;; (...) | ;;; (...) | ||
Línea 887: | Línea 889: | ||
;;; VALOR_NUMERICO puede ser cualquier valor de 0 a 65535 | ;;; VALOR_NUMERICO puede ser cualquier valor de 0 a 65535 | ||
ld a, h | ld a, h | ||
- | | + | |
jr nz, no_iguales | jr nz, no_iguales | ||
ld a, l | ld a, l | ||
- | | + | |
jr nz, no_iguales | jr nz, no_iguales | ||
iguales: | iguales: | ||
Línea 902: | Línea 904: | ||
===== Consideraciones de las condiciones ===== | ===== Consideraciones de las condiciones ===== | ||
- | A la hora de utilizar instrucciones condicionales hay que tener en cuenta que no todas las instrucciones afectan a los flags. Por ejemplo, la instrucción '' | + | A la hora de utilizar instrucciones condicionales hay que tener en cuenta que no todas las instrucciones afectan a los flags. Por ejemplo, la instrucción '' |
<code z80> | <code z80> | ||
Línea 931: | Línea 933: | ||
</ | </ | ||
- | Más detalles sobre los saltos condicionales: | + | Más detalles sobre los saltos condicionales: |
Los saltos por Paridad/ | Los saltos por Paridad/ | ||
- | | + | |
\\ | \\ | ||
Línea 955: | Línea 957: | ||
ld a, ' | ld a, ' | ||
jr continuar | jr continuar | ||
+ | |||
es_cero: | es_cero: | ||
ld a, ' | ld a, ' | ||
+ | |||
continuar: | continuar: | ||
;;; Aqui A vale ' | ;;; Aqui A vale ' | ||
Línea 968: | Línea 972: | ||
jr z, es_cero | jr z, es_cero | ||
ld a, ' | ld a, ' | ||
+ | |||
es_cero: | es_cero: | ||
;;; Aqui A vale ' | ;;; Aqui A vale ' | ||
Línea 1077: | Línea 1082: | ||
No obstante, nos obliga a copiar B en A para poder hacer el '' | No obstante, nos obliga a copiar B en A para poder hacer el '' | ||
- | | + | |
- | | + | |
<code z80> | <code z80> | ||
Línea 1126: | Línea 1131: | ||
Hemos visto cómo podemos ejecutar código un número determinado de veces en base a contar desde un determinado valor hasta 0, utilizando los flags para saber cuándo debe de finalizar el bucle y continuar la ejecución del programa. | Hemos visto cómo podemos ejecutar código un número determinado de veces en base a contar desde un determinado valor hasta 0, utilizando los flags para saber cuándo debe de finalizar el bucle y continuar la ejecución del programa. | ||
- | En ciertas ocasiones concretas los desarrolladores evitan utilizar bucles y lo que hacen es **repetir** el mismo bloque de instrucciones N veces, para evitar el salto ('' | + | En ciertas ocasiones concretas los desarrolladores evitan utilizar bucles y lo que hacen es **repetir** el mismo bloque de instrucciones N veces, para evitar el salto ('' |
Este proceso se llama **desenrollar el bucle** y consiste en, básicamente, | Este proceso se llama **desenrollar el bucle** y consiste en, básicamente, | ||
Línea 1219: | Línea 1224: | ||
* La instrucción para cargar B con un valor ya no es necesaria (-2 bytes y 7 ciclos de reloj menos de ejecución del programa). | * La instrucción para cargar B con un valor ya no es necesaria (-2 bytes y 7 ciclos de reloj menos de ejecución del programa). | ||
- | * El '' | + | * El '' |
* El último '' | * El último '' | ||
Línea 1298: | Línea 1303: | ||
< | < | ||
- | cpi = CP [HL] | + | cpi = cp (hl) |
inc hl | inc hl | ||
dec bc | dec bc | ||
Línea 1309: | Línea 1314: | ||
< | < | ||
- | cpd = CP [HL] | + | cpd = cp (hl) |
dec hl | dec hl | ||
dec bc | dec bc | ||
</ | </ | ||
- | Y el pequeño matiz: así como CP [HL] afecta al indicador C de Carry, //cpi y cpd//, aunque realizan esa operación intermedia, //no lo afectan//. | + | Y el pequeño matiz: así como '' |
Las instrucciones '' | Las instrucciones '' | ||
Línea 1392: | Línea 1397: | ||
ORG 50000 | ORG 50000 | ||
- | ld hl, texto | + | ld hl, texto ; Inicio de la busqueda |
- | ld a, ' | + | ld a, ' |
- | ld bc, 100 | + | ld bc, 100 ; Número de bytes donde buscar |
- | cpir | + | cpir ; Realizamos la búsqueda |
- | jp nz, No_Hay | + | jp nz, No_Hay |
- | | + | ; el flag de Z estará a cero. |
- | ; Si seguimos por aquí es que se encontró | + | |
- | dec hl | + | dec hl ; Decrementamos HL para apuntar al byte |
- | | + | ; encontrado en memoria. |
ld bc, texto | ld bc, texto | ||
scf | scf | ||
- | ccf ; Ponemos el carry flag a 0 (scf+ccf) | + | ccf |
- | sbc hl, bc | + | sbc hl, bc ; HL = HL - BC |
- | | + | ; = (posicion encontrada) - (inicio cadena) |
- | | + | ; = posición de ' |
ld b, h | ld b, h | ||
- | ld c, l ; BC = HL | + | ld c, l |
- | ret ; Volvemos a basic con el resultado en BC | + | ret |
No_Hay: | No_Hay: | ||
Línea 1438: | Línea 1443: | ||
* Hacemos HL = posición de memoria donde empieza la cadena. | * Hacemos HL = posición de memoria donde empieza la cadena. | ||
* Hacemos A = ' | * Hacemos A = ' | ||
- | * Ejecutamos un '' | + | * Ejecutamos un '' |
* En HL obtendremos la posición absoluta + 1 donde se encuentra el carácter ' | * En HL obtendremos la posición absoluta + 1 donde se encuentra el carácter ' | ||
* Decrementamos HL para que apunte a la ' | * Decrementamos HL para que apunte a la ' | ||
Línea 1444: | Línea 1449: | ||
* Volvemos al BASIC con el resultado en BC. El '' | * Volvemos al BASIC con el resultado en BC. El '' | ||
- | | + | |
< | < |