Ensamblador x86

Anuncio
Instrucción mov
Modos de direccionamiento
Condicionales y control de flujo
Ensamblador x86
Lección 4
Ing. Jorge Castro-Godı́nez
MT7003 Microprocesadores y Microcontroladores
Área de Ingenierı́a Mecatrónica
Instituto Tecnológico de Costa Rica
I Semestre 2014
Jorge Castro-Godı́nez
Ensamblador x86
1 / 45
Instrucción mov
Modos de direccionamiento
Condicionales y control de flujo
Contenido
1
Instrucción mov
2
Modos de direccionamiento
3
Condicionales y control de flujo
Jorge Castro-Godı́nez
Ensamblador x86
2 / 45
Instrucción mov
Modos de direccionamiento
Condicionales y control de flujo
3 tipos de instrucciones
Transferencia de datos entre memoria y registros
Carga o load: de memoria a registros
%reg = Mem[address]
Almacenamiento o store: de registro a memoria.
Mem[address] = %reg
Recordar que la memoria es como un arreglo indexado
Funciones aritméticas con datos en registros o en memoria.
Transferencia de control
Saltos incondicionales desde o hacia procedimientos.
Saltos condicionales.
Jorge Castro-Godı́nez
Ensamblador x86
3 / 45
Instrucción mov
Modos de direccionamiento
Condicionales y control de flujo
Moviendo datos: IA32
(1)
movx source,destination
x puede ser b, w, l
movl src,dest: mueve 4 bytes, long
word
movw src,dest: mueve 2 bytes, word
movb src,dest: mueve 1 bytes, byte
Estas instrucciones son muy comunes
en un código tı́pico.
Jorge Castro-Godı́nez
Ensamblador x86
%eax
%ecx
%edx
%ebx
%esi
%edi
%esp
%ebp
4 / 45
Instrucción mov
Modos de direccionamiento
Condicionales y control de flujo
Moviendo datos: IA32
(2)
Tipos de operandos
Inmediatos: dato constante entero.
$0x400, $-533
Parecido a C, pero con $ como prefijo.
Registro: uno de ocho registros.
%eax, %edx
Recordar que %esp, %ebp están reservados para propósitos
especı́ficos.
Para algunas instrucciones en particular, los otros registros
tienen una funcionalidad especial, e.g., multiplicaciones y
divisiones.
Memoria: x cantidad de bytes de la memoria direccionados
por el valor de un registro.
El ejemplo más simple ( %eax)
Existen varios modos de direccionamiento.
Jorge Castro-Godı́nez
Ensamblador x86
5 / 45
Instrucción mov
Modos de direccionamiento
Condicionales y control de flujo
Combinaciones de movl
Source
Imm
movl
Reg
Mem
Dest
Reg
Src,Dest
movl $0x4,%eax
C Analog
var_a = 0x4;
Mem movl $-147,(%eax)
*p_a = -147;
Reg movl %eax,%edx
Mem movl %eax,(%edx)
var_d = var_a;
Reg
movl (%eax),%edx
*p_d = var_a;
var_d = *p_a;
No se pueden realizar transferencias entre direcciones de
memoria en una sola instrucción!
Jorge Castro-Godı́nez
Ensamblador x86
6 / 45
Instrucción mov
Modos de direccionamiento
Condicionales y control de flujo
Modos básicos de direccionamiento
Indirecto
(R)
Mem[Reg[R]]
Registro R especifica la dirección de memoria.
movl ( %ecx), %eax
Desplazamiento
D(R)
Mem[Reg[R]+D]
Registro R especifica la dirección de memoria, e.g., el inicio de
alguna región de memoria.
D especifica un desplasamiento de la dirección dada por R (es
un offset).
movl 8( %ebp), %edx
Jorge Castro-Godı́nez
Ensamblador x86
7 / 45
Instrucción mov
Modos de direccionamiento
Condicionales y control de flujo
Swap
(1)
void swap(int *xp, int *yp)
{
int t0 = *xp;
int t1 = *yp;
*xp = t1;
*yp = t0;
}
swap:
pushl %ebp
movl %esp,%ebp
pushl %ebx
movl
movl
movl
movl
movl
movl
12(%ebp),%ecx
8(%ebp),%edx
(%ecx),%eax
(%edx),%ebx
%eax,(%edx)
%ebx,(%ecx)
movl -4(%ebp),%ebx
movl %ebp,%esp
popl %ebp
ret
Jorge Castro-Godı́nez
Ensamblador x86
Set
Up
Body
Finish
8 / 45
Instrucción mov
Modos de direccionamiento
Condicionales y control de flujo
Swap
(2)
void swap(int *xp, int *yp)
{
int t0 = *xp;
int t1 = *yp;
*xp = t1;
*yp = t0;
}
•
•
•
Offset
12
yp
8
xp
4
Rtn adr
Stack
(in memory)
0 Old %ebp
Register
%ecx
%edx
%eax
%ebx
Value
yp
xp
t1
t0
%ebp
-4 Old %ebx
movl
movl
movl
movl
movl
movl
Jorge Castro-Godı́nez
12(%ebp),%ecx
8(%ebp),%edx
(%ecx),%eax
(%edx),%ebx
%eax,(%edx)
%ebx,(%ecx)
Ensamblador x86
#
#
#
#
#
#
ecx
edx
eax
ebx
*xp
*yp
=
=
=
=
=
=
yp
xp
*yp (t1)
*xp (t0)
eax
ebx
9 / 45
Instrucción mov
Modos de direccionamiento
Condicionales y control de flujo
Swap
(3)
123
Address
0x124
456
0x120
0x11c
%eax
0x118
Offset
%edx
%ecx
%ebx
12
0x120
0x110
xp
8
0x124
0x10c
4
Rtn adr
0x108
%esi
0
%ebp
%edi
0x104
-4
%esp
%ebp
0x114
yp
0x104
movl
movl
movl
movl
movl
movl
12(%ebp),%ecx
8(%ebp),%edx
(%ecx),%eax
(%edx),%ebx
%eax,(%edx)
%ebx,(%ecx)
Jorge Castro-Godı́nez
#
#
#
#
#
#
Ensamblador x86
ecx
edx
eax
ebx
*xp
*yp
0x100
=
=
=
=
=
=
yp
xp
*yp (t1)
*xp (t0)
eax
ebx
10 / 45
Instrucción mov
Modos de direccionamiento
Condicionales y control de flujo
Swap
(4)
123
Address
0x124
456
0x120
0x11c
%eax
0x118
%edx
0x124
%ecx
0x120
Offset
%ebx
12
0x120
0x110
xp
8
0x124
0x10c
4
Rtn adr
0x108
%esi
0
%ebp
%edi
0x104
-4
%esp
%ebp
0x114
yp
0x104
movl
movl
movl
movl
movl
movl
12(%ebp),%ecx
8(%ebp),%edx
(%ecx),%eax
(%edx),%ebx
%eax,(%edx)
%ebx,(%ecx)
Jorge Castro-Godı́nez
#
#
#
#
#
#
Ensamblador x86
ecx
edx
eax
ebx
*xp
*yp
0x100
=
=
=
=
=
=
yp
xp
*yp (t1)
*xp (t0)
eax
ebx
11 / 45
Instrucción mov
Modos de direccionamiento
Condicionales y control de flujo
Swap
(5)
123
Address
0x124
456
0x120
0x11c
%eax
456
%edx
0x124
%ecx
0x120
0x118
Offset
%ebx
12
0x120
0x110
xp
8
0x124
0x10c
4
Rtn adr
0x108
%esi
0
%ebp
%edi
0x104
-4
%esp
%ebp
0x114
yp
0x104
movl
movl
movl
movl
movl
movl
12(%ebp),%ecx
8(%ebp),%edx
(%ecx),%eax
(%edx),%ebx
%eax,(%edx)
%ebx,(%ecx)
Jorge Castro-Godı́nez
#
#
#
#
#
#
Ensamblador x86
ecx
edx
eax
ebx
*xp
*yp
0x100
=
=
=
=
=
=
yp
xp
*yp (t1)
*xp (t0)
eax
ebx
12 / 45
Instrucción mov
Modos de direccionamiento
Condicionales y control de flujo
Swap
(6)
123
Address
0x124
456
0x120
0x11c
%eax
456
%edx
0x124
%ecx
0x120
%ebx
0x118
Offset
123
12
0x120
0x110
xp
8
0x124
0x10c
4
Rtn adr
0x108
%esi
0
%ebp
%edi
0x104
-4
%esp
%ebp
0x114
yp
0x104
movl
movl
movl
movl
movl
movl
12(%ebp),%ecx
8(%ebp),%edx
(%ecx),%eax
(%edx),%ebx
%eax,(%edx)
%ebx,(%ecx)
Jorge Castro-Godı́nez
#
#
#
#
#
#
Ensamblador x86
ecx
edx
eax
ebx
*xp
*yp
0x100
=
=
=
=
=
=
yp
xp
*yp (t1)
*xp (t0)
eax
ebx
13 / 45
Instrucción mov
Modos de direccionamiento
Condicionales y control de flujo
Swap
(7)
456
Address
0x124
456
0x120
0x11c
%eax
456
456
%edx
0x124
%ecx
0x120
%ebx
0x118
Offset
123
12
0x120
0x110
xp
8
0x124
0x10c
4
Rtn adr
0x108
%esi
0
%ebp
%edi
0x104
-4
%esp
%ebp
0x114
yp
0x104
movl
movl
movl
movl
movl
movl
12(%ebp),%ecx
8(%ebp),%edx
(%ecx),%eax
(%edx),%ebx
%eax,(%edx)
%ebx,(%ecx)
Jorge Castro-Godı́nez
#
#
#
#
#
#
ecx
edx
eax
ebx
*xp
*yp
Ensamblador x86
0x100
=
=
=
=
=
=
yp
xp
*yp (t1)
*xp (t0)
eax
ebx
14 / 45
Instrucción mov
Modos de direccionamiento
Condicionales y control de flujo
Swap
(8)
456
Address
0x124
123
0x120
0x11c
%eax
456
%edx
0x124
%ecx
0x120
%ebx
0x118
Offset
123
12
0x120
0x110
xp
8
0x124
0x10c
4
Rtn adr
0x108
%esi
0
%ebp
%edi
0x104
-4
%esp
%ebp
0x114
yp
0x104
movl
movl
movl
movl
movl
movl
12(%ebp),%ecx
8(%ebp),%edx
(%ecx),%eax
(%edx),%ebx
%eax,(%edx)
%ebx,(%ecx)
Jorge Castro-Godı́nez
#
#
#
#
#
#
Ensamblador x86
ecx
edx
eax
ebx
*xp
*yp
0x100
=
=
=
=
=
=
yp
xp
*yp (t1)
*xp (t0)
eax
ebx
15 / 45
Instrucción mov
Modos de direccionamiento
Condicionales y control de flujo
Modos de Direccionamiento
(1)
Las direcciones usadas para accesar memoria en mov y otras
instrucciones, pueden ser calculadas de diferentes maneras.
Forma general:
D(Rb,Ri,S)
Mem[Reg[Rb] + S*Reg[Ri] + D]
D: Desplazamiento constante en 1, 2 o 4 bytes.
Rb: Registro base: cualquiera de los 8 registros
Ri: Registro ı́ndice: cualquiera de los registros, excepto %esp.
S: Escala; 1, 2, 4 o 8
Jorge Castro-Godı́nez
Ensamblador x86
16 / 45
Instrucción mov
Modos de direccionamiento
Condicionales y control de flujo
Modos de Direccionamiento
(2)
Casos especiales: puede ser cualquer combinación de D, Rb,
Ri y S.
(Rb,Ri)
D(Rb,Ri)
(Rb,Ri,S)
Mem[Reg[Rb] + Reg[Ri]]
Mem[Reg[Rb] + Reg[Ri] + D]
Mem[Reg[Rb] + S*Reg[Ri]]
Jorge Castro-Godı́nez
Ensamblador x86
17 / 45
Instrucción mov
Modos de direccionamiento
Condicionales y control de flujo
Ejemplos
%edx
0xf000
%ecx
0x100
(Rb,Ri)
D(,Ri,S)
(Rb,Ri,S)
D(Rb)
Mem[Reg[Rb]+Reg[Ri]]
Mem[S*Reg[Ri]+D]
Mem[Reg[Rb]+S*Reg[Ri]]
Mem[Reg[Rb] +D]
Expression
Address Computation
Address
0x8(%edx)
0xf000 + 0x8
0xf008
(%edx,%ecx)
0xf000 + 0x100
0xf100
(%edx,%ecx,4)
0xf000 + 4*0x100
0xf400
0x80(,%edx,2)
2*0xf000 + 0x80
0x1e080
Jorge Castro-Godı́nez
Ensamblador x86
18 / 45
Instrucción mov
Modos de direccionamiento
Condicionales y control de flujo
Cálculo de una dirección
leal src,dest
src es la expresión del modo de direccionamiento.
dest tendrá la dirección calculada por la expresión
lea: load effective address
Ejemplo: leal ( %edx, %ecx,4), %eax
Esta instrucción puede ser usada para realizar operaciones de
la forma: x + k*i
Jorge Castro-Godı́nez
Ensamblador x86
19 / 45
Instrucción mov
Modos de direccionamiento
Condicionales y control de flujo
Operaciones aritméticas
Format
addl Src,Dest
Computation
Dest = Dest + Src
subl Src,Dest
Dest = Dest - Src
imull Src,Dest
Dest = Dest * Src
sall Src,Dest
Dest = Dest << Src
Also called shll
sarl Src,Dest
Dest = Dest >> Src
Arithmetic
shrl Src,Dest
Dest = Dest >> Src
Logical
xorl Src,Dest
Dest = Dest ^ Src
andl Src,Dest
Dest = Dest & Src
Src,Dest
Dest = Dest | Src
orl
Watch out for argument order! (especially subl)
Jorge Castro-Godı́nez
Ensamblador x86
20 / 45
Instrucción mov
Modos de direccionamiento
Condicionales y control de flujo
Operaciones aritméticas
incl Dest
Dest = Dest + 1
decl Dest
Dest = Dest - 1
negl Dest
Dest = -Dest
notl Dest
Dest = ~Dest
Jorge Castro-Godı́nez
Ensamblador x86
21 / 45
Instrucción mov
Modos de direccionamiento
Condicionales y control de flujo
leal en operaciones aritméticas
int arith
(int x, int y, int z)
{
int t1 = x+y;
int t2 = z+t1;
int t3 = x+4;
int t4 = y * 48;
int t5 = t3 + t4;
int rval = t2 * t5;
return rval;
}
arith:
pushl %ebp
movl %esp,%ebp
movl 8(%ebp),%eax
movl 12(%ebp),%edx
leal (%edx,%eax),%ecx
leal (%edx,%edx,2),%edx
sall $4,%edx
addl 16(%ebp),%ecx
leal 4(%edx,%eax),%eax
imull %ecx,%eax
movl %ebp,%esp
popl %ebp
ret
Jorge Castro-Godı́nez
Ensamblador x86
(1)
Set
Up
Body
Finish
22 / 45
Instrucción mov
Modos de direccionamiento
Condicionales y control de flujo
leal en operaciones aritméticas
(2)
arith
int arith
(int x, int y, int z)
{
int t1 = x+y;
int t2 = z+t1;
int t3 = x+4;
int t4 = y * 48;
int t5 = t3 + t4;
int rval = t2 * t5;
return rval;
}
movl 8(%ebp),%eax
movl 12(%ebp),%edx
leal (%edx,%eax),%ecx
leal (%edx,%edx,2),%edx
sall $4,%edx
addl 16(%ebp),%ecx
leal 4(%edx,%eax),%eax
imull %ecx,%eax
Offset
•
•
•
16
z
12
y
8
x
4
Rtn adr
0 Old %ebp
#
#
#
#
#
#
#
#
eax
edx
ecx
edx
edx
ecx
eax
eax
Jorge Castro-Godı́nez
=
=
=
=
=
=
=
=
Stack
%ebp
x
y
x+y (t1)
y + 2*y = 3*y
48*y (t4)
z+t1 (t2)
4+t4+x (t5)
t5*t2 (rval)
Ensamblador x86
23 / 45
Instrucción mov
Modos de direccionamiento
Condicionales y control de flujo
leal en operaciones aritméticas
(3)
arith
int arith
(int x, int y, int z)
{
int t1 = x+y;
int t2 = z+t1;
int t3 = x+4;
int t4 = y * 48;
int t5 = t3 + t4;
int rval = t2 * t5;
return rval;
}
movl 8(%ebp),%eax
movl 12(%ebp),%edx
leal (%edx,%eax),%ecx
leal (%edx,%edx,2),%edx
sall $4,%edx
addl 16(%ebp),%ecx
leal 4(%edx,%eax),%eax
imull %ecx,%eax
Offset
•
•
•
16
z
12
y
8
x
4
Rtn adr
0 Old %ebp
#
#
#
#
#
#
#
#
eax
edx
ecx
edx
edx
ecx
eax
eax
Jorge Castro-Godı́nez
=
=
=
=
=
=
=
=
Stack
%ebp
x
y
x+y (t1)
y + 2*y = 3*y
48*y (t4)
z+t1 (t2)
4+t4+x (t5)
t5*t2 (rval)
Ensamblador x86
24 / 45
Instrucción mov
Modos de direccionamiento
Condicionales y control de flujo
leal en operaciones aritméticas
(4)
arith
int arith
(int x, int y, int z)
{
int t1 = x+y;
int t2 = z+t1;
int t3 = x+4;
int t4 = y * 48;
int t5 = t3 + t4;
int rval = t2 * t5;
return rval;
}
movl 8(%ebp),%eax
movl 12(%ebp),%edx
leal (%edx,%eax),%ecx
leal (%edx,%edx,2),%edx
sall $4,%edx
addl 16(%ebp),%ecx
leal 4(%edx,%eax),%eax
imull %ecx,%eax
Offset
•
•
•
16
z
12
y
8
x
4
Rtn adr
0 Old %ebp
#
#
#
#
#
#
#
#
eax
edx
ecx
edx
edx
ecx
eax
eax
=
=
=
=
=
=
=
=
Stack
%ebp
x
y
x+y (t1)
y + 2*y = 3*y
48*y (t4)
z+t1 (t2)
4+t4+x (t5)
t5*t2 (rval)
x86
Jorge Castro-Godı́nez
Ensamblador x86
25 / 45
Instrucción mov
Modos de direccionamiento
Condicionales y control de flujo
leal en operaciones aritméticas
(5)
arith
int arith
(int x, int y, int z)
{
int t1 = x+y;
int t2 = z+t1;
int t3 = x+4;
int t4 = y * 48;
int t5 = t3 + t4;
int rval = t2 * t5;
return rval;
}
movl 8(%ebp),%eax
movl 12(%ebp),%edx
leal (%edx,%eax),%ecx
leal (%edx,%edx,2),%edx
sall $4,%edx
addl 16(%ebp),%ecx
leal 4(%edx,%eax),%eax
imull %ecx,%eax
Offset
•
•
•
16
z
12
y
8
x
4
Rtn adr
0 Old %ebp
#
#
#
#
#
#
#
#
eax
edx
ecx
edx
edx
ecx
eax
eax
Jorge Castro-Godı́nez
=
=
=
=
=
=
=
=
Stack
%ebp
x
y
x+y (t1)
y + 2*y = 3*y
48*y (t4)
z+t1 (t2)
4+t4+x (t5)
t5*t2 (rval)
Ensamblador x86
26 / 45
Instrucción mov
Modos de direccionamiento
Condicionales y control de flujo
leal en operaciones aritméticas
arith
§ Instructions in different
int arith
(int x, int y, int z)
{
int t1 = x+y;
int t2 = z+t1;
int t3 = x+4;
int t4 = y * 48;
int t5 = t3 + t4;
int rval = t2 * t5;
return rval;
}
movl 8(%ebp),%eax
movl 12(%ebp),%edx
leal (%edx,%eax),%ecx
leal (%edx,%edx,2),%edx
sall $4,%edx
addl 16(%ebp),%ecx
leal 4(%edx,%eax),%eax
imull %ecx,%eax
(6)
order from C code
§ Some expressions require
multiple instructions
§ Some instructions cover
multiple expressions
§ Get exact same code when
compile:
§ (x+y+z)*(x+4+48*y)
#
#
#
#
#
#
#
#
eax
edx
ecx
edx
edx
ecx
eax
eax
Jorge Castro-Godı́nez
=
=
=
=
=
=
=
=
x
y
x+y (t1)
y + 2*y = 3*y
48*y (t4)
z+t1 (t2)
4+t4+x (t5)
t5*t2 (rval)
Ensamblador x86
27 / 45
Instrucción mov
Modos de direccionamiento
Condicionales y control de flujo
Otro ejemplo
(1)
int logical(int x, int y)
{
int t1 = x^y;
int t2 = t1 >> 17;
int mask = (1<<13) - 7;
int rval = t2 & mask;
return rval;
}
logical:
pushl %ebp
movl %esp,%ebp
movl
xorl
sarl
andl
Set
Up
8(%ebp),%eax
12(%ebp),%eax
$17,%eax
$8185,%eax
Body
movl %ebp,%esp
popl %ebp
ret
movl
xorl
sarl
andl
8(%ebp),%eax
12(%ebp),%eax
$17,%eax
$8185,%eax
#
#
#
#
eax
eax
eax
eax
=
=
=
=
x
x^y
t1>>17
t2 & 8185
Offset
12
Finish
•
•
•
Stack
y
8
x
4
Rtn adr
0
Old %ebp
%ebp
x86
Jorge Castro-Godı́nez
Ensamblador x86
28 / 45
Instrucción mov
Modos de direccionamiento
Condicionales y control de flujo
Otro ejemplo
(2)
int logical(int x, int y)
{
int t1 = x^y;
int t2 = t1 >> 17;
int mask = (1<<13) - 7;
int rval = t2 & mask;
return rval;
}
logical:
pushl %ebp
movl %esp,%ebp
movl
xorl
sarl
andl
8(%ebp),%eax
12(%ebp),%eax
$17,%eax
$8185,%eax
Body
movl %ebp,%esp
popl %ebp
ret
movl
xorl
sarl
andl
8(%ebp),%eax
12(%ebp),%eax
$17,%eax
$8185,%eax
Jorge Castro-Godı́nez
Set
Up
eax
eax
eax
eax
=
=
=
=
Finish
x
x^y
(t1)
t1>>17 (t2)
t2 & 8185
Ensamblador x86
29 / 45
Instrucción mov
Modos de direccionamiento
Condicionales y control de flujo
Otro ejemplo
(3)
int logical(int x, int y)
{
int t1 = x^y;
int t2 = t1 >> 17;
int mask = (1<<13) - 7;
int rval = t2 & mask;
return rval;
}
logical:
pushl %ebp
movl %esp,%ebp
movl
xorl
sarl
andl
8(%ebp),%eax
12(%ebp),%eax
$17,%eax
$8185,%eax
Body
movl %ebp,%esp
popl %ebp
ret
movl
xorl
sarl
andl
8(%ebp),%eax
12(%ebp),%eax
$17,%eax
$8185,%eax
Jorge Castro-Godı́nez
Set
Up
eax
eax
eax
eax
=
=
=
=
Finish
x
x^y
(t1)
t1>>17 (t2)
t2 & 8185
Ensamblador x86
30 / 45
Instrucción mov
Modos de direccionamiento
Condicionales y control de flujo
Otro ejemplo
(4)
int logical(int x, int y)
{
int t1 = x^y;
int t2 = t1 >> 17;
int mask = (1<<13) - 7;
int rval = t2 & mask;
return rval;
}
logical:
pushl %ebp
movl %esp,%ebp
movl
xorl
sarl
andl
8(%ebp),%eax
12(%ebp),%eax
$17,%eax
$8185,%eax
Jorge Castro-Godı́nez
8(%ebp),%eax
12(%ebp),%eax
$17,%eax
$8185,%eax
Body
movl %ebp,%esp
popl %ebp
ret
213 = 8192,
213 – 7 = 8185
…0010000000000000, …0001111111111001
movl
xorl
sarl
andl
Set
Up
eax
eax
eax
eax
=
=
=
=
Finish
x
x^y
(t1)
t1>>17 (t2)
t2 & 8185
Ensamblador x86
31 / 45
Instrucción mov
Modos de direccionamiento
Condicionales y control de flujo
Condicionales
Un salto condicional es suficiente para implementar la mayorı́a
de construcciones de control de flujo presentes en lenguajes de
alto nivel.
if (condicion) then {...} else {...}
while (condicion) then {...}
do {...} while (condicion)
for (inicializacion;condicion;iterativo) {...}
Saltos incondicionales también implementan estructuras
relativas a control de flujo.
Tanto saltos condicionales como incondicionales se referencian
como saltos.
Jorge Castro-Godı́nez
Ensamblador x86
32 / 45
Instrucción mov
Modos de direccionamiento
Condicionales y control de flujo
Saltos
Instrucciones jX: saltar a una parte diferente del código
dependiendo de las condiciones.
jX
Condition
Description
jmp
1
Unconditional
je
ZF
Equal / Zero
jne
~ZF
Not Equal / Not Zero
js
SF
Negative
jns
~SF
Nonnegative
jg
~(SF^OF)&~ZF
Greater (Signed)
jge
~(SF^OF)
Greater or Equal (Signed)
jl
(SF^OF)
Less (Signed)
jle
(SF^OF)|ZF
Less or Equal (Signed)
ja
~CF&~ZF
Above (unsigned)
jb
CF
Below (unsigned)
Jorge Castro-Godı́nez
Ensamblador x86
33 / 45
Instrucción mov
Modos de direccionamiento
Condicionales y control de flujo
Estado del procesador (parcialmente)
Información acerca del estado actual de la ejecución de un
programa.
%eax
%ecx
%edx
%ebx
%esi
General purpose
registers
%edi
%esp
%ebp
Current stack top
%eip
Instruction pointer
CF ZF SF OF
Condition codes
Jorge Castro-Godı́nez
Current stack frame
Ensamblador x86
34 / 45
Instrucción mov
Modos de direccionamiento
Condicionales y control de flujo
Códigos Condicionales - establecidos implı́citamente
Registros de un solo bit.
CF:
ZF:
SF:
OF:
bandera
bandera
bandera
bandera
de
de
de
de
acarreo (carry)
cero
signo (para datos con signo)
desbordamiento (overflow)
Establecidos implı́citamente por operaciones aritméticas.
E.g., addl src,dest ↔ t = a + b
CF es uno si se da un acarreo proveniente de los bits más
significativos (desbordamiento sin signo)
ZF es uno si t == 0
SF es uno si t < 0
OF es uno si se da un desbordamiento con datos con signo
La instrucción lea no afecta estas banderas.
Jorge Castro-Godı́nez
Ensamblador x86
35 / 45
Instrucción mov
Modos de direccionamiento
Condicionales y control de flujo
Códigos Condicionales - establecidos explı́citamente
Establecidos explı́citamente por la instrucción de comparación.
E.g., cmpl src1,src2
cmpl b,a es como
a-b sin tener ningún destino del resultado.
CF es uno si se da un acarreo del bit más significativo (usado
en comparaciones sin signo).
ZF es uno si a == b
SF es uno si (a-b) < 0 (con signo).
OF es uno si se da un desbordamiento con datos con signo.
Jorge Castro-Godı́nez
Ensamblador x86
36 / 45
Instrucción mov
Modos de direccionamiento
Condicionales y control de flujo
Códigos Condicionales - establecidos explı́citamente
Establecidos explı́citamente por la instrucción de prueba
(test).
E.g., testl src1,src2
testl b,a es como
a & b sin tener ningún destino del resultado.
Establece los códigos de condición basado en los valores de
scr1 y scr2.
Útil para tener uno de los operandos como una máscara.
ZF es uno si a && b == 0
SF es uno si a & b < 0
Jorge Castro-Godı́nez
Ensamblador x86
37 / 45
Instrucción mov
Modos de direccionamiento
Condicionales y control de flujo
Ejemplo de salto condicional
int absdiff(int x, int y)
{
int result;
if (x > y) {
result = x-y;
} else {
result = y-x;
}
return result;
}
(1)
absdiff:
pushl
movl
movl
movl
cmpl
jle
subl
movl
.L8:
leave
ret
.L7:
subl
jmp
Jorge Castro-Godı́nez
%ebp
%esp, %ebp
8(%ebp), %edx
12(%ebp), %eax
%eax, %edx
.L7
%eax, %edx
%edx, %eax
Setup
Body1
Finish
%edx, %eax
.L8
Ensamblador x86
Body2
38 / 45
Instrucción mov
Modos de direccionamiento
Condicionales y control de flujo
Ejemplo de salto condicional
int absdiff(int x, int y)
{
int result;
if (x > y) {
result = x-y;
} else {
result = y-x;
}
return result;
}
Jorge Castro-Godı́nez
(2)
int goto_ad(int x, int y)
{
int result;
if (x <= y) goto Else;
result = x-y;
Exit:
return result;
Else:
result = y-x;
goto Exit;
}
Ensamblador x86
39 / 45
Instrucción mov
Modos de direccionamiento
Condicionales y control de flujo
Ejemplo de salto condicional
int goto_ad(int x, int y)
{
int result;
if (x <= y) goto Else;
result = x-y;
Exit:
return result;
Else:
result = y-x;
goto Exit;
}
int x
int y
%edx
%eax
Jorge Castro-Godı́nez
(3)
absdiff:
pushl
movl
movl
movl
cmpl
jle
subl
movl
.L8:
leave
ret
.L7:
subl
jmp
Ensamblador x86
%ebp
%esp, %ebp
8(%ebp), %edx
12(%ebp), %eax
%eax, %edx
.L7
%eax, %edx
%edx, %eax
%edx, %eax
.L8
40 / 45
Instrucción mov
Modos de direccionamiento
Condicionales y control de flujo
Ejemplo de salto condicional
int goto_ad(int x, int y)
{
int result;
if (x <= y) goto Else;
result = x-y;
Exit:
return result;
Else:
result = y-x;
goto Exit;
}
int x
int y
%edx
%eax
Jorge Castro-Godı́nez
(4)
absdiff:
pushl
movl
movl
movl
cmpl
jle
subl
movl
.L8:
leave
ret
.L7:
subl
jmp
Ensamblador x86
%ebp
%esp, %ebp
8(%ebp), %edx
12(%ebp), %eax
%eax, %edx
.L7
%eax, %edx
%edx, %eax
%edx, %eax
.L8
41 / 45
Instrucción mov
Modos de direccionamiento
Condicionales y control de flujo
Ejemplo de salto condicional
int goto_ad(int x, int y)
{
int result;
if (x <= y) goto Else;
result = x-y;
Exit:
return result;
Else:
result = y-x;
goto Exit;
}
int x
int y
%edx
%eax
Jorge Castro-Godı́nez
(5)
absdiff:
pushl
movl
movl
movl
cmpl
jle
subl
movl
.L8:
leave
ret
.L7:
subl
jmp
Ensamblador x86
%ebp
%esp, %ebp
8(%ebp), %edx
12(%ebp), %eax
%eax, %edx
.L7
%eax, %edx
%edx, %eax
%edx, %eax
.L8
42 / 45
Instrucción mov
Modos de direccionamiento
Condicionales y control de flujo
Ejemplo de salto condicional
int goto_ad(int x, int y)
{
int result;
if (x <= y) goto Else;
result = x-y;
Exit:
return result;
Else:
result = y-x;
goto Exit;
}
int x
int y
%edx
%eax
Jorge Castro-Godı́nez
(6)
absdiff:
pushl
movl
movl
movl
cmpl
jle
subl
movl
.L8:
leave
ret
.L7:
subl
jmp
Ensamblador x86
%ebp
%esp, %ebp
8(%ebp), %edx
12(%ebp), %eax
%eax, %edx
.L7
%eax, %edx
%edx, %eax
%edx, %eax
.L8
43 / 45
Instrucción mov
Modos de direccionamiento
Condicionales y control de flujo
Ejemplo de salto condicional
int goto_ad(int x, int y)
{
int result;
if (x <= y) goto Else;
result = x-y;
Exit:
return result;
Else:
result = y-x;
goto Exit;
}
int x
int y
%edx
%eax
Jorge Castro-Godı́nez
(7)
absdiff:
pushl
movl
movl
movl
cmpl
jle
subl
movl
.L8:
leave
ret
.L7:
subl
jmp
Ensamblador x86
%ebp
%esp, %ebp
8(%ebp), %edx
12(%ebp), %eax
%eax, %edx
.L7
%eax, %edx
%edx, %eax
%edx, %eax
.L8
44 / 45
Instrucción mov
Modos de direccionamiento
Condicionales y control de flujo
Direccionamiento relativo al PC
Saltos relativos al PC son reubicados
Aquellos saltos con posiciones absolutas no pueden ser
reubicados.
0x100
0x102
0x104
…
0x172
cmp
je
…
…
add
Jorge Castro-Godı́nez
r2, r3
0x70
r3, r4
Ensamblador x86
0x1000
0x1002
0x1004
…
0x1072
45 / 45
Descargar