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_4 [19-01-2024 07:21] – sromero | cursos:ensamblador:lenguaje_4 [22-01-2024 07:54] (actual) – [PUSH y POP] sromero | ||
---|---|---|---|
Línea 156: | Línea 156: | ||
xx = (SP) | xx = (SP) | ||
SP = SP+2 | SP = SP+2 | ||
+ | </ | ||
+ | |||
+ | Visto en " | ||
+ | |||
+ | <code z80> | ||
+ | push hl = LET SP = SP-2 | ||
+ | POKE (SP+1), H | ||
+ | POKE SP, L | ||
+ | |||
+ | pop hl | ||
+ | LET H = PEEK (SP+1) | ||
+ | LET SP = SP+2 | ||
</ | </ | ||
Línea 427: | Línea 439: | ||
Esto es lo que se conoce como " | Esto es lo que se conoce como " | ||
- | Esto implica que las lecturas y escrituras de nuestro programa (ejecutado por el Z80) en la página de memoria de 16KB que va desde 16384 a 32767 se ven interrumpidas de forma constante por la ULA (aunque de forma transparente para nuestro programa), por lo que ubicar la pila en esta zona puede suponer una ralentización con respecto a ubicarla más arriba de la dirección 32768. Recuerda que cada operación '' | + | Esto implica que las lecturas y escrituras de nuestro programa (ejecutado por el Z80) en la página de memoria de 16KB que va desde 16384 a 32767 se ven interrumpidas de forma constante por la ULA (aunque de forma transparente para nuestro programa), por lo que ubicar la pila en esta zona puede suponer una ralentización con respecto a ubicarla más arriba de la dirección 32768. Recuerda que cada operación '' |
Por lo tanto, si establecemos la pila por debajo de nuestro programa, y tenemos nuestro programa en 32768, tendremos la pila en contended memory, lo cual implica que funcionará un poco más lenta en general que tener la pila por encima. | Por lo tanto, si establecemos la pila por debajo de nuestro programa, y tenemos nuestro programa en 32768, tendremos la pila en contended memory, lo cual implica que funcionará un poco más lenta en general que tener la pila por encima. | ||
Línea 449: | Línea 461: | ||
Para saltar a subrutinas utilizamos la instrucción '' | Para saltar a subrutinas utilizamos la instrucción '' | ||
- | El lector podría preguntar, ¿por qué no utilizar las instrucciones de salto '' | + | El lector podría preguntar, ¿por qué no utilizar las instrucciones de salto '' |
- | | + | |
<code z80> | <code z80> | ||
Línea 467: | Línea 479: | ||
| | ||
- | Pero, ¿cómo llamamos a las subrutinas y volvemos de ellas? Comencemos probando con '' | + | Pero, ¿cómo llamamos a las subrutinas y volvemos de ellas? Comencemos probando con '' |
<code z80> | <code z80> | ||
Línea 648: | Línea 660: | ||
</ | </ | ||
- | Del mismo modo, el uso de '' | + | Del mismo modo, el uso de '' |
Al igual que '' | Al igual que '' | ||
Línea 677: | Línea 689: | ||
<code z80> | <code z80> | ||
; | ; | ||
- | ; MULTIPLI: Multiplica DE*BC | + | ; Mult_HL_DE: Multiplica DE*BC |
- | ; | + | ; |
- | ; | + | ; Entrada: |
- | ; | + | ; |
- | ; | + | ; Salida: |
+ | ; Modifica: | ||
; | ; | ||
- | MULTIPLICA: | + | Mult_HL_DE: |
push af ; Preservamos AF porque F se va a modificar | push af ; Preservamos AF porque F se va a modificar | ||
push bc ; Preservamos BC porque su valor se pierde | push bc ; Preservamos BC porque su valor se pierde | ||
ld hl, 0 | ld hl, 0 | ||
- | MULTI01: | + | multiloop_01: |
add hl, de | add hl, de | ||
dec bc | dec bc | ||
ld a, b | ld a, b | ||
or c | or c | ||
- | jr nz, MULTI01 | + | jr nz, multiloop_01 |
pop bc ; Rescatamos el valor de BC | pop bc ; Rescatamos el valor de BC | ||
Línea 700: | Línea 713: | ||
</ | </ | ||
- | Antes de hacer la llamada a MULTIPLICA, tendremos que cargar en DE y en BC los valores que queremos multiplicar, | + | Antes de hacer la llamada a '' |
| | ||
Línea 758: | Línea 771: | ||
ld bc, (size) | ld bc, (size) | ||
- | (Codigo) | + | (... código ...) |
ld (salida), a ; Devolvemos un valor | ld (salida), a ; Devolvemos un valor | ||
Línea 783: | Línea 796: | ||
En C (y en otros lenguajes de programación) los parámetros se insertan en la pila en el orden en que son leídos. La subrutina después lee los valores sin desapilarlos, | En C (y en otros lenguajes de programación) los parámetros se insertan en la pila en el orden en que son leídos. La subrutina después lee los valores sin desapilarlos, | ||
- | En ese caso, simplemente apilamos los parámetros con PUSH y dentro de la rutina los vamos recogiendo con POP: | + | En ese caso, simplemente apilamos los parámetros con '' |
| | ||
Línea 881: | Línea 894: | ||
<code z80> | <code z80> | ||
BuclePrincipal: | BuclePrincipal: | ||
- | call Leer_Teclado | + | call LeerTeclado |
- | call Logica_Juego | + | call LogicaJuego |
- | call Comprobar_Estado | + | call ComprobarEstado |
- | jp Bucle_Principal | + | jp BuclePrincipal |
- | Leer_Teclado: | + | LeerTeclado: |
ret | ret | ||
- | Logica_Juego: | + | LogicaJuego: |
ret | ret | ||
- | Comprobar_Estado: | + | ComprobarEstado: |
ret | ret | ||
</ | </ |