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