CALC |
Top |
Realiza un salto condicional (si el bit 0 del acumulador es 1) a otra parte del programa y memoriza el punto de retorno. Puede ser dentro de la misma porción de código o de alguna otra subrutina. Esta se identifica por una etiqueta (label), y es siempre hacia adelante (no es prudente hacer saltos hacia atrás). Es el punto a partir del cual se seguirá ejecutando el programa. Use la instrucción RET para volver a seguir ejecutando el programa en la línea siguiente a la que se hizo el llamado.
CAL Sub1 ;Salta (o llama) a la subrutina de nombre "Sub1" ST q0.0 ;Instrucción siguiente o punto de retorno de la subrutina LD sm0.4 CALC Sub1 ;Salta (o llama) a la subrutina de nombre "Sub1" si el bit 0 del acumulador es 1 LD sm0.5 CALNC Sub1 ;Salta a la subrutina llamada "Sub1" si el bit 0 del acumulador es 0 END ;Termina el programa y vuelve a ejecutar desde el principio
Sub1: LD i0.0 ;Primera instrucción de la subrutina RETC ;Retorno condicional (si el bit 0 del acumulador es 1) AND i0.1 RETNC ;Retorno condicional (si el bit 0 del acumulador es 0) XOR i0.2 RET ;Retorno incondicional de la subrutina
Encadenamiento de llamados
ld 1
;Valor 1 al acumulador (Acc)
CALC sum_xi_yi ;Ejecuta
sum_xi_yi porque el Acc está en 1 CALC suma_yi
;suma_y se ejecutará si Acc quedó en 1 después de haber ejecutado sum_xi_yi
CALC a
;a se ejecutará si Acc quedó en 1 después de haber ejecutado suma_yi
sum_xi_yi, suma_yi y a alteran el valor del acumulador. Por eso la siguiente es dependiente de la anterior. Para que el esquema funcione cada una de las subrutinas debería terminar con un LD 1: sum_xi_yi: instrucción ... ... LD 1 ;Valor devuelto en el acumulador definido RET suma_yi: instrucción ... ... LD 1 ;Valor devuelto en el acumulador definido RET
Esta instrucción se ubica en el sector de salidas
Sintaxis Nótese que termina con los ":", y que éstos no aparecen cuando está con la instrucción. Así es como se distingue entre destino de salto y argumento. Supongamos que hay varias máquinas iguales controladas por un solo equipo. Repetir la rutina por cada una adaptando los nombres de los saltos es para errores. Se puede organizar poniendo el código de control de cada una en una pestaña. Esto reduce a copiar y pegar con mucho menos cambios. Entonces, para que las etiquetas no se confundan se les añade el nombre de la pestaña correspondiente: NombrePestaña@Etiqueta
Entonces el programa (principal) quedaría de esta forma: CAL Main@Sub1 ;Salta (o llama) a la subrutina de nombre "Sub1" ST q0.0 ;Instrucción siguiente o punto de retorno de la subrutina LD sm0.4 CALC Main@Sub1 ;Salta (o llama) a la subrutina de nombre "Sub1" si el bit 0 del acumulador es 1 LD sm0.5 CALNC Main@Sub1 ;Salta a la subrutina llamada "Sub1" si el bit 0 del acumulador es 0 END ;Termina el programa y vuelve a ejecutar desde el principio
Sub1: LD i0.0 ;Primera instrucción de la subrutina RETC ;Retorno condicional (si el bit 0 del acumulador es 1) AND i0.1 RETNC ;Retorno condicional (si el bit 0 del acumulador es 0) XOR i0.2 RET ;Retorno incondicional de la subrutina
Descargar ejemplo (español) (inglés)
|