Vous êtes sur la page 1sur 59

Arquitectura Intel x86,

Intel x86-64_ segunda parte

Sistemas Computacionales
Instrucciones de Control

Hasta ahora hemos visto ejecucin secuencial


de instrucciones.
qu pasa con la ejecucin no secuencial?

Lenguaje de programacin C posee estructuras


de control complejas como por ejemplo: loops
condicionales, switch, etc
Instrucciones de Control

Ejecucin secuencial del cdigo puede verse


alterada por una instruccin de salto (jump)
Instrucciones de ejecucin condicional dependen
de la ocurrencia de ciertos eventos para decidir el
cdigo a ejecutar.
Cdigos de condicin del procesador informan al
programa de la ocurrencia de eventos en las ltimas
operaciones aritmtico-lgicas
Cdigo C y ensamblador x86

Lenguaje ensamblador Intel x86 posee gran


variedad de saltos
Saltos directos e indirectos
Condicionales e incondicionales
A direcciones absolutas y relativas
Lenguaje ensamblador no posee estructuras de
control complejas
Pero, stas se pueden implementar utilizando
saltos
Bits de condicin

CPUs Intel mantienen flags o bits de condicin


Describen resultados de ltimas operaciones de ALU
Carry Flag (CF): ltima operacin gener un rebalse
Zero Flag (ZF): ltima operacin gener un cero
Sign Flag (SF): ltima operacin gener un nmero
negativo
Overflow Flag (OF): Itima operacin gener un
rebalse de complemento a 2
Ejemplo: resta

Calcular 0xE4534980 0x94533443


Equivalente a 0xE4534980+[0x94533443]2
Restar B es sumar el complemento a 2 de B
Equivalente a 0xE4534980+0x6BACCBBD
Resultado es 0x15000153D
Cmo quedan los bits de condicin?
ZF = 0
CF = 1
SF = 0
OF = 1
Ejemplo: resta

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

Luego, resultado final es 0x15000153D generando un


rebalse y un overflow
Ejemplo: t = a + b

Implementado con instruccin addl


CF: (unsigned t) < (unsigned a)
ZF: (t == 0)
SF: (t < 0)
OF: (a < 0 == b < 0) && (t < 0 != a <
0)
Instrucciones y cdigos de
condicin
Todas las instrucciones aritmtico-lgicas
excepto leaq alteran los cdigos de condicin
(leaq se usa en el calculo de direcciones)
Operaciones lgicas hacen CF y OF = 0
Desplazamientos hacen OF = 0
Desplazamientos a la izquierda almacenan en
el carry CF el ltimo bit desplazado
Instr. Comparacin y test

Modifican los cdigos de condicin


No modifican operandos
Instr. Comparacin y test

Instruccin de comparacin no modifica sus


argumentos
subq %rax, %rcx
Instruccin hace %rcx %rcx - %rax y modifica

los cdigos de condicin


cmpq %rax, %rcx
Instruccin no modifica %rcx, slo calcula %rcx -

%rax y modifica los cdigos de condicin


andq %rax, %rcx modifica %rcx

testq %rax, %rcx no modifica %rcx


Acceso a cdigos de
condicin
No se pueden leer los cdigos de condicin
directamente
Usamos instrucciones setX
Mediante saltos condicionales
Mediante instrucciones de movimiento condicional
de datos
Acceso a cdigos de condicin
Instrucciones setX

Resultado de instrucciones setX es 1 byte de


valor 0 1
Destino de instruccin es un registro de 8 bits un
byte en memoria
Usar movzbl para convertir resultado a 32 bits
Instrucciones setX

Ejemplo: si a est en %rdi y b en %rsi

cmpq %rsi, %rdi a < b?


setq %al Bits 0-7 %rax son 0 1
movzbq %al, %rax Extiende valor a 64
bits Set remaining bytes of %rax to 0
Ahora %rax es 0 1
hace 0, los 56 bits
superiores de %rax
Instrucciones de salto

La instruccin jump es una instruccin de


salto que cambia la ejecucin secuencial del
cdigo.
Destinos del salto generalmente indicado por un
rtulo (label)
movq $0, %rax
jmp .L1 Label
movq (%rax), %rdx
L1:
popq %rdx
Label
Instrucciones de salto

Cambio en secuencia de ejecucin de instrucciones


Saltos condicionales e incondicionales

Instruccin Sinnimo Condicin Descripcin

jmp Rtulo 1 Salto directo

jmp *Operando 1 Salto indirecto


je Rtulo jz ZF Igual/Cero
jne Rtulo jnz ~ZF No igual/No cero
js Rtulo SF Negativo
jns Rtulo ~SF No negativo
Instrucciones de salto

Instruccin Sinnimo Condicin Descripcin


jg Rtulo jnle ~(SF^OF)&~ZF Mayor (signed >)
jge Rtulo jnl ~(SF^OF) Mayor o igual (signed >=)
jl Rtulo jnge SF^OF Menor (signed<)
jle Rtulo jng (SF^OF)|ZF Menor o igual(signed<=)
ja Rtulo jnbe ~CF &~ZF Superior (unsigned >)
jae Rtulo jnb ~CF Superior o igual (unsigned
>=)
jb Rtulo jnae CF Inferior(unsigned <)
jbe Rtulo jna CF|ZF Inferior o
igual(unsigned<=)
Rtulo es una referencia a una lnea en el cdigo fuente
Ojo que ^ es XOR de bits
Instrucciones de salto JUMP
icondicionales
Instruccin Jump realiza salto incondicional.

Salto directo: la direccin de destino es parte de la


instruccin. Ej: jmp *%rax

Salto indirecto: la direccin de destino se lee


desde un registro o una direccin de memoria. Ej:
jmp *(%rax)
Instrucciones de salto
condicionales
El resto de las instrucciones de salto son
condicionales. Ej: je, js, ja, jb, etc.
Saltan o continan ejecutando la siguiente
instruccin dependiendo de una condicin.
Similar a instrucciones setX
Argumento debe ser un rtulo
Saltos condicionales solo pueden ser directos.
Instrucciones de salto
condicionales
Instrucciones de salto condicional para
Comparacin de enteros con signo
Comparacin de enteros sin signo
Usados para implementar estructuras de control
de C como if-else
Instrucciones de salto

Jump if greater
jg Rtulo jnle ZF = 0 and SF = OF Mayor
(signed)

Carga en instruction pointer (EIP) register la


direccin especificada ,si el primer operando de la
comparacin previa con CMP es mayor que el
segundo (realiza una comparacin del tipo
signed).

Fuente para ver ms instrucciones:


https://en.wikibooks.org/wiki/X86_Assembly/Control_Flow
http://unixwiz.net/techtips/x86-jumps.html
Instrucciones de salto

Jump if below
jbe Rtulo jna CF = 1 or ZF = 1 Inferior o
igual(unsigned)

Carga en instruction pointer (EIP) register la


direccin especificada ,si el primer operando de la
comparacin previa con la instruccin CMP es
menor o igual que el segundo. Jbe es lo mismo
que jle excepto que realiza una comparacin sin
signo (unsigned)
Ejemplo

Lazo: testl %eax, %ecx %eax&%ecx (resultado 0)

jne Fin salta si ZF=1

subl %edx, %esi D=D-S , comparacin

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

Lazo si %esi es mayor que %edx


Cdigo C y ensamblador x86

Lenguaje de programacin C posee estructuras


de control complejas
if-else
do-while
while
for
goto
Cmo traducir estas estructuras a lenguaje de
mquina?
Utilizando slo instrucciones goto
Transformando if-else

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

Funcin recibe 2 argumentos


Tiene 2 valores de retorno posibles
Flujo de control puede tomar 2 caminos
Reescribir usando slo instrucciones
goto
No son recomendados en C, pero son
muy usados en ensamblador!
Fciles de traducir a ensamblador
Comando goto

Comando goto rotulo fuerza la ejecucin


del cdigo asociado al rtulo
Rtulo termina con ejecucin de sentencia y salta a
otra parte del cdigo:

if (condicin) goto rotulo1;


sentencia1;
rotulo1: sentencia2;

29
Transformando if-else

Cdigo C original Cdigo C modificado con


goto
long x_menor=0, x_mayor=0; long x_menor=0, x_mayor=0;
long absdiff(long x, long long gotodiff(long x, long y)
y) {
{
long result;
if (x < y){ long result;
xmenor++; if (x >= y)
result= y x; goto x_mayor_y;
} x_menor++;
else{ result = y x;
xmayor++; return result;
return x y; x_mayor_y:
} x_mayor ++;
return result;
result = x y;
}
return result;
}
Transformando if-else

Nueva versin del cdigo utiliza slo una


instruccin goto
Requiere un rtulo
El flujo de control de las instrucciones est en
forma explcita
Dos valores de retorno posible
Valor a retornar en rval
Un punto de entrada a la funcin
Dos puntos de salida de la funcin
Transformando if-else
Transformando if-else

Cdigo C Cdigo ensamblador x86-64 equivalente


long x_menor=0,
x_mayor=0;
long gotodiff(long x, long y)
{
long result;
if (x >= y)
goto x_mayor_y;
x_menor++;
result = y x;
return result;
x_mayor_y:
x_mayor ++;
result = x y;
return result;
}
Suponemos x en %rdi, y en %rsi
if-else con doble condicin

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

void cond(long a, long void cond(long a, long *p)


*p) {
{ if (p != 0) {
if (p && a > *p) if(a > *p) {
*p = a; *p = a;
} }
}
}

Condicin cortocircuito : Caso de AND Si Cond1 es Falso, no es necesario evaluar


Cond2: AND ser Falso
if-else con doble condicin
Codigo en C Cdigo ensamblador equivalente
void cond(long a, long *p)
{
if (p != 0) {
if(a > *p) {
*p = a;
}
}
}

Nota: Ignorar instruccin rep no hace nada.


Movimiento condicional de
datos
Instrucciones de movimiento condicional transfieren
datos si se cumple una condicin
Si la condicin no se cumple, no hay movimiento de datos
Instrucciones de movimiento condicional reemplazan 2
instrucciones (instrucciones especiales presents en Intel
x86-64)
Formato CMOVXX donde XX es una condicin
Condiciones posibles son similares a instrucciones setXX y
saltos condicionales jXX
Introducidas por Intel en Pentium Pro en IA32
Aprovechadas al mximo por AMD en AMD64
Movimiento condicional

Instruccin Sinnimo Condicin Descripcin


cmove S, R cmovz ZF Igual / Cero

cmovne S, R cmovnz ~ZF Distinto / No cero


cmovs S, R SF Negativo
cmovns S, R ~SF No negativo
cmovg S, R cmovnle ~(SF^OF)&~ZF Mayor (signed >)
cmovge S, R cmovnl ~(SF^OF) Mayor o igual (signed >=)
cmovl S, R cmovnge SF^OF Menor (signed <)
cmovle S, R cmovng (SF^OF)|ZF Menor o igual (signed <=)
cmova D cmovnbe ~CF &~ZF Superior (unsigned >)
cmovae D cmovnb ~CF Superior o igual (unsigned >=)
cmovb D cmovnae CF Inferior (unsigned <)
cmovbe D cmovna CF|ZF Inferior o igual (unsigned <=)
Ejemplo de movimiento condicional

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

Cdigo x86 de 32 bits usando instruccin de


movimiento condicional
cmpl $5, %eax # Compara a con 5
cmovz %ecx, %ebx # Copia y en x
Instrucciones de movimiento condicional
Permiten reducir la longitud del cdigo
Permiten evitar penalidades de prediccin de salto
causadas por saltos condicionales
Acelera la ejecucin de programas en
procesadores que tienen pipelining
Ejemplo de movimiento
condicional
Ejemplo de movimiento condicional

Cdigo ensamblador mov condicional valor


absoluto
absdiff:
movq %rsi, %rax
subq %rdi, %rax // rval = y x
movq %rdi, %rdx
subq %rsi, %rdx // eval = x - y
cmpq %rsi, %rdi // Compara x e y
cmovge %rdx, %rax // Si es >=,
// rval = eval
Ret
Ejemplo de movimiento condicional

Sea el siguiente cdigo C


d = (condicin) ? expr_V : expr_F;
Generalmente esto se compila como
if (!condicin)
goto falso;
d = expr_V;
goto fin;
Falso:
d = expr_F;
Fin:
Ejemplo de movimiento condicional

Usando movimiento condicional, el cdigo


generado es similar a ste
v = expr_V;
vf = expr_F;
t = expr_test; (condicin)
if (!t) v = vf;
Este ltimo condicional se realiza en una sola
instruccin de movimiento condicional
Instrucciones CMOV

Ensamblador deduce el largo del operando a


partir del largo del destino
No hay instrucciones cmov para bytes (b)
1. CPU lee el dato desde registro memoria
2. Verifica el cdigo de condicin
3. Modifica el destino si la condicin se
cumple
4. No lo modifica, si la condicin no se
cumple
Lazos do-while

Tipo de lazo muy usado en lenguaje de


mquina, No tan utilizado en lenguaje C
Ciclo While en su Ciclo While en su implementacin con
implementacin Original ifs y gotos
Loop:
{
nucleo del
lazo;
t = condicion;
Se convierte en cdigo C equivalente que }
usa slo ifs y gotos
if (t)
goto Loop;
Ejemplo: Factorial

El factorial de un entero no negativo n, es el


producto de todos los enteros positivos
menores o iguales que n.
Por ejemplo:
5!=5x4x3x2xx1=120
Donde 0!=1
Ejemplo: Factorial con do-while
Ejemplo:Factorial

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

Puede implementarse como do-while


Lazo do-while
Lazo while
t = condicin;
while(condicion) {
if (!t)
nucleo del lazo;
goto listo;
}
do
{
Sacar la primera verificacin
nucleo del lazo;
de la condicion del lazo
} while(condicion);
listo:
Ejemplo: Factorial con while

Ciclo while verifica condicin antes de


ejecutar el ncleo del lazo
Si condicin no se cumple, el lazo no se ejecuta
A diferencia de ciclo do_while
Condiciones iniciales comienzan para 0! ,
result=1 antes de comenzar el ciclo.
Para pasarlo a ensamblador, primero debemos
reescribirlo para usar comandos goto
Ejemplo: Factorial con while
Ejemplo: Factorial con while
Lazos for

Forma general de lazo iterativo


Equivalente a lazo while

Lazo for Lazo while


for (expr1; expr2; expr3) expr1;
{ while(expr2)
nucleo del lazo; {
} nucleo del lazo;
expr3;
}
Lazos for

Lazo for con goto


expr1;
if (!expr2)
Lazo while
goto done;
expr1; loop:
while(expr2) {
{ body statement;
body statement; expr3;
}
expr3;
if (expr2)
} goto loop;
listo:
Ejemplo: Factorial con for

Factorial con For Factorial con gotos

expr1;

expr3;
expr2 ;
expr1
!expr2 ;
expr2
expr3
Ejemplo: Factorial con for

Factorial en C Factorial en cdigo ensamblador

Vous aimerez peut-être aussi