Académique Documents
Professionnel Documents
Culture Documents
Sistemas Computacionales
Instrucciones de Control
0xE4534980 a binario
1110 0100 0101 0011 0100 1001 1000 0000
0x94533443 a binario
1001 0100 0101 0011 0011 0100 0100 0011
Complemento a 2 de 0x94533443
Equivale a sacar complemento a 1 y sumarle 1
0110 1011 1010 1100 1100 1011 1011 1100 compl1
+ 1
0110 1011 1010 1100 1100 1011 1011 1101
6 B A C C B B D compl2
Ejemplo: resta
Luego 0xE4534980+0x6BACCBBD
1110 0100 0101 0011 0100 1001 1000 0000
+ 0110 1011 1010 1100 1100 1011 1011 1101
1 0101 0000 0000 0000 0001 0101 0011 1101
1 5 0 0 0 1 5 3 D
Jump if greater
jg Rtulo jnle ZF = 0 and SF = OF Mayor
(signed)
Jump if below
jbe Rtulo jna CF = 1 or ZF = 1 Inferior o
igual(unsigned)
ja Lazo
Fin: pop %edx
Cdigo anterior
Salta a Fin si %eax es igual a %ecx.
En caso contrario, resta %edx de %esi, y salta a
Cdigo C original
Calcula valor absoluto de la diferencia entre dos
nmeros
long x_menor=0, x_mayor=0;
long absdiff(long x, long y) {
long result;
if (x < y){
xmenor++;
result= y x;
}
else{
xmayor++;
return x y;
}
return result;
}
Transformando if-else
29
Transformando if-else
Cdigo C original
void cond(long a, long *p)
{
if (p && a > *p)
*p = a;
}
if-else con condicin doble
Lenguaje C evala primero la condicin de la
izquierda
Descomponer condicin doble en condiciones
simples
if-else con doble condicin
Cdigo C modificado
Evala primero condicin de la izquierda y
luego la de la derecha
Cumple condicin de cortocircuito
Caso de AND Si Cond1 es Falso, no es necesario evaluar Cond2: AND ser
Falso
void cond(long a, long *p) {
if (p != 0) {
if(a > *p) {
*p = a;
}
}
}
if-else con doble condicin
Cdigo C original Cdigo C modificado
Cdigo C condicional
if (a == 5) x = y
Suponga que %eax contiene a, %ebx
contiene x y %ecx contiene y
Cdigo x86 de 32 bits es
cmpl $5, %eax # Compara a con 5
jnz Fin # Si no es igual,
# ir a Fin
movl %ecx, %ebx # Copia y en x
Fin:
Ejemplo de movimiento condicional
Factorial en ensamblador
Cdigo sirve slo si n > 0
// Suponemos que n est en %rdi
fact_do:
movl $1, %eax // result = 1 (32 MSB = 0)
.L2:
imulq %rdi, %rax // Calcula result *= n
subq $1, %rdi // Decrementa n
cmpq $1, %rdi // Compara n con 1
jg .L2 // Si es mayor, ir a L2
rep
ret
Lazos while
expr1;
expr3;
expr2 ;
expr1
!expr2 ;
expr2
expr3
Ejemplo: Factorial con for