Registros Arquitectura x86 M. en C. Erika Vilches Registro • Area especial de almacenamiento de alta velocidad dentro del CPU • Registros del procesador x86 • Registros de datos de propósito general • Registros de segmento • Registros de estado y control (EIP e EFLAGS) Registros de datos de propósito general • Ocho registros de 32 bits para almacenar: • Operandos enteros para operaciones lógicas y aritméticas • Apuntadores (direcciones de memoria) Los 4 que usaremos Data hoy: Registers (continued) General-Purpose 31 16 8 ah eax bh ebx ch ecx dh edx ax bx cx dx 0 al bl cl dl Accumulator Base Count Data 69 Registro de banderas • Registro de 32 bits • Colección de bits individuales de estado y control llamados banderas. • Generalmente, cada bandera es manipulada independientemente y no como un conjunto. Flags Register (continued) eflags ... 31 of df 11 10 ! CF carry flag ! PF parity flag ! AF auxiliary flag ! ZF Zero Flag sf zf 7 6 af pf cf 4 2 0 ! SF sign flag ! DF direction flag ! OF overflow flag 77 cf - Carry Flag pf - Parity Flag af - Auxiliary flag zf - Zefo Flag sf - Sign Flag of - Overflow Flag Ejercicio 1 Indique el estado de las banderas af, sf, pf y zf después de realizar la siguiente operación: mov eax, 0x45612378 add eax, 0xA20001F2 CF y OF Regla Universal XOR A 0 0 1 1 NOT B 0 1 0 1 Z 0 1 1 0 A 0 1 Z 1 0 ADD bold itálica = Carry Flag (CF) bold itálica XOR bold = Overflow Flag (OF) Interno unsigned 00001000→ 10001101 141 01101000 104 11110101 245 válido signed CF=0, OF=0 −115 104 − 11 válido Interno unsigned 01100000→ 01100001 97 01110000 112 11010001 209 válido signed CF=0, OF=1 97 112 − 47 inválido Interno unsigned 11110000→ 11010000 208 01110000 112 01000000 64 inválido signed CF=1, OF=0 − 48 112 64 válido Interno unsigned 10000000→ 11000100 196 10010001 145 01010101 85 inválido signed CF=1, OF=1 − 60 −111 85 inválido Carry Flag reporta validez bajo la interpretación unsigned. Overflow Flag reporta validez bajo la interpretación signed. Saltos Condicionales: JC, JNC, JO, JNO Ejercicios ADD Sume (con 8 bits) e indique todas las banderas: • 1+1 • 1 + (-1) • 127 + 1 • (-128) + (-1) SUB NOT bold itálica = Carry Flag (CF) Original unsigned signed 11000100 10010001 Diferencia 196 145 51 válido CF=0 − 60 −111 51 válido OF=0 Original unsigned signed 01100001 01110000 Diferencia 97 112 241 inválido CF=1 97 112 − 15 válido OF=0 bold itálica XOR bold = Overflow Flag (OF) interno 11001100 11000100 01101111 00110011 Original unsigned 10001101 01101000 Diferencia 141 104 37 válido CF=0 interno 00000000 01100001 10010000 11110001 Original unsigned 01100001 10010000 Diferencia 97 144 209 inválido CF=1 signed −115 104 37 inválido OF=1 signed 97 −112 − 47 inválido OF=1 interno 10011000 10001101 10011000 00100101 interno 01100000 01100001 01110000 11010001 Carry Flag reporta validez bajo la interpretación unsigned. Overflow Flag reporta validez bajo la interpretación signed. Saltos Condicionales: JC, JNC, JO, JNO NOTA: SUB se hace internamente sumando (ADD) el complemento a 2 del substraendo Ejercicios SUB Reste (con 8 bits) e indique todas las banderas: • 0-1 • (-128) - 1 • 127 – (-1) • (-32) - 65 Reglas de validez Unsigned • • • Restar a – b es válido cuando a > b (CF = 0) Restar a – b es inválido cuando a < b (CF = 1) La suma es invalida cuando el resultado es menor que los sumandos (CF = 1) Signed • • • • • • La resta a – b es válida cuando a > b y el resultado es positivo (CF = 0, SF = 0) • La suma de dos cantidades de diferente signo es siempre válida (OF = 0) La resta a – b es inválida cuando a > b y el resultado es negativo (OF = 1, SF = 1) La resta a – b es válida cuando a < b y el resultado es negativo (OF = 0, SF = 1) La resta a – b es inválida cuando a < b y el resultado es positivo (OF = 1, SF = 0) La resta de dos cantidades del mismo signo es siempre valida (OF = 0) La suma es inválida cuando la suma dos cantidades del mismo signo tiene el signo opuesto (OF = 1) Reglas de validez Unsigned • • • X Restar a – b es válido cuando a > b (CF = 0) Restar a – b es inválido cuando a < b (CF = 1) La suma es invalida cuando el resultado es menor que los sumandos (CF = 1) Signed • • • • • • La resta a – b es válida cuando a > b y el resultado es positivo (CF = 0, SF = 0) • La suma de dos cantidades de diferente signo es siempre válida (OF = 0) La resta a – b es inválida cuando a > b y el resultado es negativo (OF = 1, SF = 1) La resta a – b es válida cuando a < b y el resultado es negativo (OF = 0, SF = 1) La resta a – b es inválida cuando a < b y el resultado es positivo (OF = 1, SF = 0) La resta de dos cantidades del mismo signo es siempre valida (OF = 0) La suma es inválida cuando la suma dos cantidades del mismo signo tiene el signo opuesto (OF = 1) Resumiendo ADD SUB bold itálica = Carry Flag (CF) NOT bold itálica = Carry Flag (CF) bold itálica XOR bold = Overflow Flag (OF) bold itálica XOR bold = Overflow Flag (OF) Carry Flag reporta validez bajo la interpretación unsigned. Overflow Flag reporta validez bajo la interpretación signed.