08.05.2013 Views

Juego de instrucciones del 80C31

Juego de instrucciones del 80C31

Juego de instrucciones del 80C31

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!