Juego de instrucciones del 80C31
Juego de instrucciones del 80C31
Juego de instrucciones del 80C31
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
AJMP CASO1<br />
AJMP CASO2<br />
AJMP CASO3<br />
AJMP CASO4<br />
3.5.2 Subrutinas e Interrupciones<br />
Hay dos variaciones <strong>de</strong> la instrucción CALL: ACALL y LCALL, usando direccionamiento absoluto y largo,<br />
respectivamente. Como con JMP, el nemotécnico genérico CALL pue<strong>de</strong> usarse con el ensamblador <strong>de</strong> Intel<br />
si el programador no le preocupa el modo en que la dirección es codificada. Cualquier instrucción apila el<br />
contenido <strong>de</strong>l contador <strong>de</strong> programa en la pila y carga al contador <strong>de</strong> programa con la dirección especificada<br />
en la instrucción.<br />
Notar que el PC contiene la dirección <strong>de</strong> la instrucción que sigue a la instrucción CALL cuando él es<br />
empujado (pushed) en la pila. El PC es puesto en la pila primero el byte bajo, <strong>de</strong>spués el byte alto. Esos bytes<br />
son recuperados <strong>de</strong> la pila en el or<strong>de</strong>n reverso. Por ejemplo, si una instrucción LCALL está en memoria <strong>de</strong><br />
código en localida<strong>de</strong>s 2100H-2102H y el SP contiene 60H, entonces LCALL (a) pone la dirección <strong>de</strong> retorno<br />
(2103H) en la pila, en RAM interna, colocando 03H en 61H y 21H en 62H; (b) <strong>de</strong>ja al SP conteniendo 62H;<br />
y (c) salta a la subrutina al cargar al PC con la dirección contenida en bytes 2 y 3 <strong>de</strong> la instrucción.<br />
Las <strong>instrucciones</strong> LCALL y ACALL tienen las mismas restricciones en la dirección <strong>de</strong>stino como las<br />
<strong>instrucciones</strong> JMP y AJMP recién discutidas.<br />
Las subrutinas <strong>de</strong>ben terminar con la instrucción RET, la que retorna la ejecución a la instrucción que sigue a<br />
la CALL. No hay nada mágico acerca <strong>de</strong> la manera en que la instrucción RET regresa al programa principal.<br />
Ella simplemente "popea" los últimos dos bytes <strong>de</strong> la pila y los pone en el contador <strong>de</strong> programa. hay una<br />
regla cardinal <strong>de</strong> programación con subrutinas que ellas <strong>de</strong>ben siempre ser entradas con una instrucción<br />
CALL, y ellas <strong>de</strong>ben siempre ser <strong>de</strong>jadas con una instrucción RET. Saltando hacia a<strong>de</strong>ntro o hacia afuera <strong>de</strong><br />
una subrutina <strong>de</strong> cualquier otro modo usualmente <strong>de</strong>sbalancea la pila y causa que el programa se pierda.<br />
RETI se usa para retornar <strong>de</strong>s<strong>de</strong> una rutina <strong>de</strong> servicio a interrupción (ISR). La única diferencia entre RET y<br />
RETl es que RETI señala al sistema <strong>de</strong> control <strong>de</strong> interrupciones que la interrupción activa fue atendida. Si<br />
no hay interrupciones pendientes al tiempo que RETI se ejecuta, entonces RETI es funcionalmente idéntica<br />
a RET.<br />
3.5.3 Saltos Condicionales<br />
El 8051 ofrece una variedad <strong>de</strong> <strong>instrucciones</strong> <strong>de</strong> saltos condicionales. Todas ellas especifican la dirección<br />
<strong>de</strong>stino usando direccionamiento relativo y por ello están limitadas a distancias <strong>de</strong> salto <strong>de</strong> -128 a +127 bytes<br />
<strong>de</strong>s<strong>de</strong> la instrucción que sigue a la instrucción <strong>de</strong> salto condicional. Notar, sin embargo, que el usuario<br />
especifica la dirección <strong>de</strong>stino <strong>de</strong> la misma manera como con los otros saltos, con una etiqueta o una<br />
constante <strong>de</strong> 16-bits. El ensamblador hace el resto<br />
.<br />
No hay ban<strong>de</strong>ra <strong>de</strong> 0 en el PSW. Las <strong>instrucciones</strong> JZ y JNZ prueban al acumulador <strong>de</strong> datos por tal<br />
condición.<br />
La instrucción DJNZ (<strong>de</strong>crementa y salta si no cero) es para lazos <strong>de</strong> control. Para ejecutar un lazo N veces,<br />
cargar un byte contador con N y terminar el lazo con una DJNZ hacia el inicio <strong>de</strong>l lazo, según se muestra<br />
<strong>de</strong>bajo para N = 9.<br />
MOV R7, #9<br />
LAZO: (empieza el lazo)<br />
⋅<br />
⋅<br />
⋅<br />
(termina el lazo)<br />
DJNZ R7, LAZO<br />
Profr. Salvador Saucedo 14