Professional Documents
Culture Documents
Departamento de Automatizacin y
Control Industrial - DACI
Control de Flujo
Temario
Control de Flujo
Declaracin IF
Cumple con la condicin se ejecuta la
declaracin; de lo contrario la declaracin se
omite.
if (n >= 3)
{
expr++;
n = expr;
}
Control de Flujo
Su equivalente en assembler
.def n = r16
.def expr = r17
.equ cmp = 3
...
cpi n, cmp ; Compara valor
IF: brsh EXEC ; If n <= 3 entonces salta a NEXT
rjmp NEXT ; Salta a NEXT si la expresion es falsa
EXEC: inc expr ; incrementa expr
mov n, expr ; Setea n = expr
NEXT: ... ; Continuar con el codigo
Control de Flujo
Declaracin IF-ELSE
Esto es muy similar a la instruccin IF, excepto
que tiene una sentencia else incondicional
adicional.
Un ejemplo Cdigo C.
if (n == 5)
expr++;
else
n = expr;
Flujos de Control
Su equivalente en assembler
.def n = r16
.def expr = r17
.equ cmp = 5
...
cpi n, cmp ; Comparo valor
IF: brne ELSE ; Salta a ELSE si la expresion es falsa
inc expr ; Ejecuta la declaracin IF
rjmp NEXT ; Cotinua con el cdigo
ELSE: mov n, expr ; Ejecuta la declaracin ELSE
NEXT: ... ; Continua con el cdigo
Flujos de Control
Declaracin IF-ELSEIF-ELSE
Esto es simplemente una mezcla anidada de
la IF y ELSE IF. Un ejemplo sera C:
if (n < 3)
expr++;
else if (n == 5)
n = expr;
else
n++;
Control de Flujo
Su equivalente en assembler
.def n = r16
.def expr = r17
.equ val1 = 3
.equ val2 = 5
...
cpi n, val1 ; Comparar n con val1
IF: brsh ELIF ; If no es n < 3, luego salta ELSEIF
inc expr ; Ejecuta condicion if
rjmp NEXT ; Salta Next
ELIF: cpi n, val2 ; Compara n con val2
brne ELSE ; If no es n == 5, luego salta condicion ELSE
mov n, expr ; Ejecuta condicion Execute ELSEIF
rjmp NEXT ; Salta Next
ELSE: inc n ; Ejecuta condicion ELSE
NEXT: ... ; Continua con el codigo
Control de Flujo
Declaracin WHILE
La sentencia while se utiliza comnmente
para crear bucles repetitivos. De hecho, es
comn utilizar un bucle infinito.
Su equivalente en assembler
.def n = r16
.def sum = r16
.equ limit = 10
...
WHILE: cpi n, limit ; Compara n con limit
brsh NEXT ; Cuando n > limit, salta NEXT
add sum, n ; sum += n
inc n ; n++
rjmp WHILE ; Salta para compenzar el lazo WHILE
NEXT: ... ; Continua el codigo
Control de Flujo
Sentencia DO
La sentencia DO puede considerarse una
variante de la sentencia while. En lugar de
hacer su ensayo en la parte superior del
bucle, se hace en la parte inferior. El
siguiente es un ejemplo:
do {
sum += n;
n--;
} while (n > 0);
Control de Flujo
Su equivalente en assembler
.def n = r16
.def sum = r17
.equ limit = 0
...
DO: add sum, n ; sum += n
dec n ; n--
brne DO ; si n mayor a zero sigue sumando
NEXT: ... ; Continua con el codigo
Control de Flujo
Sentencia FOR
La sentencia FOR, al igual que la sentencia
while, se utiliza para ejecutar cdigo de
forma iterativa.
Su equivalente en assembler
.def n = r16
.def sum = r17
.equ max = 10
...
ldi n, max ; Inicializa n al max
FOR: add sum, n ; sum += n
dec n ; Decrementa n
brne FOR ; Repita el lazo si n no es igual a 0
NEXT: ... ; Rest of code
Control de Flujo
Sentencia Switch
La sentencia switch es una sentencia
condicional multiva generalizar la
instruccin IF-ELSE.
switch (val) {
case 1:
a_cnt++;
break;
case 2:
case 3:
b_cnt++;
break;
default:
c_cnt++;
}
Control de Flujo
Su equivalente en assembler
.def val = r16
.def a_cnt = r17
.def b_cnt = r18
.def c_cnt = r19
...
SWITCH: ; Comenzamos declaracion SWITCH
S_1: cpi val, 1 ; Comparo val con 1
brne S_2 ; Salta a S_2 si val != 1
inc a_cnt ; Ejecuta case 1
rjmp NEXT ; Break switch
S_2: cpi val, 2 ; Compara val con 2
brne S_3 ; Salta a S_3 si val != 2
rjmp NEXT ; Break switch
S_3: cpi val, 3 ; Compara val con 3
brne DFLT ; Salta a DFLT si val != 3
inc b_cnt ; Ejecuta case 3
rjmp NEXT ; Break switch
DFLT: inc c_cnt ; Ejecuta default
NEXT: ... ; Resto de codigo
EJERCICIO
Ejercicio:
salto:
rcall copiar
dec Aux
brne salto
lazo: rjmp lazo
DEBER
Ejercicio:
Marco Herrera
marco.herrera@epn.edu.ec