Traducciones de esta página:

Herramientas de usuario

Herramientas del sitio


es:capítulo_3_-_ejecución_condicional_ii

CAPÍTULO 3

EJECUCIÓN CONDICIONAL (II)

En el capítulo anterior, comenzamos viendo las instrucciones de salto condicionales. A continuación os presentamos las llamadas a subrutina y retornos de subrutina condicionales.

Llamadas condicionales…

CNZ dirección-CNZ es abreviatura de CALL if Not Zero (Llama a la subrutina si no es cero), y como su nombre indica, el salto a la “dirección” se ejecuta si el flag de cero es 0 (indicando que en la última operación el resultado no fue cero).

CZ dirección-CZ es abreviatura de CALL if Zero (Llama a la subrutina si es cero), y es la contraria a la anterior, es decir, el salto a la “dirección” se ejecuta si el flag de cero es 1 (indicando que en la última operación el resultado fue cero).

CNC dirección-CNC es abreviatura de CALL if Not Carry (Llama a la subrutina si no hubo acarreo), y el salto a “dirección” se ejecuta si el flag de acarreo está a cero.

CC dirección-CC es abreviatura de CALL if Carry (Llama a la subrutina si hubo acarreo), y el salto a “dirección” se ejecuta si el flag de acarreo está a uno.

CPO dirección-CPO es abreviatura de CALL if Parity Odd (Llama a la subrutina si la Paridad es Impar, esto es, si el número de bits contenido en el byte resultado de la última operación era impar). El salto a “dirección” se ejecuta si el flag de paridad está a cero.

CPE dirección-CPE es abreviatura de CALL if Parity Even (Llama a la subrutina si la Paridad es Par, esto es, el número de bits contenido en el byte resultado de la última operación era par). El salto a “dirección” se ejecuta si el flag de paridad está a uno.

CP dirección-CP es abreviatura de CALL if Plus (Salta si positivo), y el salto a “dirección” se ejecuta si el resultado de la última operación fue un número positivo, en cuyo caso el flag de signo estará a cero.

CM dirección-CM es la abreviatura de CALL if Minus (Salta si negativo), y el salto a “dirección” se ejecuta si el resultado de la última operación fue un número negativo, en cuyo caso el flag de signo estará a uno.

…y retornos condicionales

RNZ-RNZ es abreviatura de Return if Not Zero (Retorna si no es cero), y e! retorno al programa que llamó a la subrutína se ejecuta si el flag de cero es 0, indicando que en la última operación el resultado no fue cero.

RZ-RZ es abreviatura de Return if Zero (Retorna si es cero), y el retorno al programa que llamó a la subrutina se ejecuta si el flag de cero es 1. indicando que en la última operación el resultado fue cero.

RNC-RNC es abreviatura de Return if Not Carry (Retorna si no hubo acarreo), y el retorno al programa que llamó a la subrutina se ejecuta si el flag de acarreo está a cero.

RC-RC es abreviatura de Return if Carry (Retorna si hubo acarreo), y el retorno al programa que llamó a la subrutina se ejecuta si el flag de acarreo está a uno.

RPO-RPO es abreviatura de Return if Parity Odd (Retorna si la Paridad es Impar), y el retorno al programa que llamó a la subrutina se ejecuta si el número de bits contenido en el byte resultado de la última operación era impar, en cuyo caso el flag de paridad estará a cero.

RPE-RPE es abreviatura de Return if Parity Even (Retorna si la Paridad es Par), y el retorno al programa que llamó a la subrutina se ejecuta si el número de bits contenido en el byte resultado de la última operación era par, en cuyo caso el flag de paridad estará a uno.

RP-RP es abreviatura de Return if Plus (Retorna si positivo), y el retorno al programa que llamó a la subrutina se ejecuta si el resultado de la última operación fue un número positivo, en cuyo caso el flag de signo estará a cero.

RM-RM es abreviatura de Return if Minus (Retorna si negativo), y el retorno al programa que llamó a la subrutina se ejecuta si el resultado de la última operación fue un número negativo, en cuyo caso el flag de signo estará a uno.

EN el capítulo anterior vimos un ejemplo del uso de la instrucción PCHL, la cual no es estrictamente condicionai, pero sirve para ejecutar opciones diversas en función de una condición. Ahora vamos con tres ejemplos de uso de las instrucciones condicionales.

Aplicaciones de las instrucciones condicionales

Para el primer ejemplo nos remitiremos al primer listado publicado en el capitulo 1.

 
             ORG 0100H
             
             LXI H,TEXTO       ; HL apunta al comienzo del texto
   BUCLE:    MOV A,M           ; Coge en A el caracter al que apunta HL
             ORA A             ; Prueba si A es cero
             RZ                ; Y si es cero, termina el programa
             MOV E,A           ; Pasa el caracter a E
             MVI C,02H         ; Función 2: imprimir letra
             PUSH H            ; Guarda en la pila el registro HL
             CALL 0005H
             POP H             ; Recupera de la pila el registro HL
             INX H             ; Apunta al siguiente caracter
             JMP BUCLE         ; y sigue 
             
   TEXTO:    DB 'Hola, mundo'
             DB 00H
             
             END  

En la quinta línea se encuentra la instrucción RZ (Retorna si cero), que como ya sabéis se ejecuta si el flag de cero está a uno. La rutina en que se encuentra imprime una cadena de caracteres letra a letra, y se termina la impresión cuando se encuentra el carácter cuyo código es cero. La instrucción MOV A,M, que también conocéis ya, carga en el registro A el byte contenido en la dirección contenida en el registro HL (en resumen, carga una letra del texto en el registro A). La siguiente instrucción, ORA A realiza, la operación lógica OR entre el registro acumulador y sí mismo. Aunque esta instrucción la estudiaremos en otro capítulo posterior, de momento baste saber que, si el acumulador contiene el número cero, tras la operación ORA A el flag de cero quedará activado (a uno), y si contiene un número distinto de cero, el flag de cero quedará desactivado (a cero).

Por tanto, esta es una buena forma de detectar el final de la cadena a imprimir. Si en A tenemos un cero (lo que verificamos con ORA A), hay que volver al programa principal, y de esto se encarga RZ, ya que el retorno se produce sólo si ORA A dejó el flag de cero activado (a uno), hecho que sólo se producirá si el registro A contenía un cero.

El listado 1 que ofrecemos a continuación, es un ejemplo típico de uso de la instrucción JNZ (Jump if Not Zero). Lo que hace el programa es ejecutar tres pitidos en el ordenador a base de imprimir tres veces el carácter 7. La instrucción DCR B lo que hace es restar 1 al registro B, guardando el resultado de la resta en el propio registro B, y si el resultado de la resta es cero, activa el flag de cero. De este modo el ordenador puede contar hasta tres, y tras el tercer pitido vuelve al CP/M.

                                                  - Listado 1 -

            ORG    0100H
                           ; Rutina que pita tres veces
            MVI    B,3     ; Numero de veces que va a pitar.
            MVI    C,2     ; Funcion de impresion de caracter a pantalla.
            MVI    E,7     ; Caracter a imprimir.
   PITA:    PUSH   B
            PUSH   D
            CALL   0005H   ; Imprime el caracter (llama al BDOS)
            POP    D
            POP    B
            DCR    B
            JNZ    PITA
            RET

            END

El listado 2 que ofrecemos a continuación, es un ejemplo de uso de la instrucción CC (CALL if Carry). La rutina imprime en binario (base 2) el número contenido en el registro A, con ocho dígitos. La instrucción RLC, que también veremos más adelante, rota a la izquierda el registro A, pasando a la vez al flag de acarreo el bit más significativo (el bit 7) del registro A. De este modo, rotando ocho veces el registro A tendremos en cada rotación un dígito binario de A en el acarreo. Con la instrucción CC UNO, lo que hacemos es llamar a una rutina que convierte el contenido del registro E (hasta ese momento el código ASCII del “0”) en el código ASCII del “1”, para imprimirlo adecuadamente. En realidad estamos usando la instrucción CC para sustituir a una instrucción inexistente, que podríamos llamar MVC (Carga el registro si el flag de acarreo es 1).

                                                  - Listado 2 -

            ORG    0100H
                           ; RUTINA QUE IMPRIME EL CONTENIDO DEL ACUMULADOR
                           ; EN BINARIO CON OCHO DIGITOS
            MVI    A,0C9H  ; EN BINARIO, 11001001

            MVI    B,8     ; NUMERO DE DIGITOS=NUHERO DE ROTACIONES
            MVI    C,2     ; FUNCION DE IMPRIMIR UN CARACTER EN LA PANTALLA
   ROTA:    MVI    E,'0'   ; CARGA EN E EL CODIGO ASCII DEL NUMERO CERO (30H)
            RLC            ; PASA EL DIGITO BINARIO MAS A LA IZQUIERDA AL ACARREO
            CC     UNO     ; SI ES UNO, LLAMA A LA SUBRUTINA
            PUSH   PSW     ; SALVA A
            PUSH   B
            PUSH   D
            CALL   0005H   ; IMPRIME EL CARACTER (0 O 1) LLAMANDO AL BDOS
            POP    D
            POP    B
            POP    PSW
            DCR    B
            JNZ    ROTA    ; CONTINUA HASTA AGOTAR LOS OCHO BITS
            RET

   UNO:     INR    E       ; HACE E=E+1, CON LO QUE E=31H (CODIGO ASCII DEL "1“)
            RET

            END
es/capítulo_3_-_ejecución_condicional_ii.txt · Última modificación: 2016/07/10 23:05 por jevicac