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 hoy: 31 16 8 0 eax ah ax al Accumulator ebx bh bx bl Base ecx ch cx cl Count edx dh dx dl Data
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.
eflags... of df sf zf af pf cf 31 11 10 7 6 4 2 0! CF carry flag! PF parity flag! AF auxiliary flag! ZF Zero Flag! SF sign flag! DF direction flag! OF overflow flag
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 B Z 0 0 0 0 1 1 1 0 1 1 1 0 NOT A Z 0 1 1 0
ADD bold itálica = Carry Flag (CF) bold itálica XOR bold = Overflow Flag (OF) Interno unsigned signed 00001000 CF=0, OF=0 10001101 141 115 01101000 104 104 11110101 245 11 válido válido Interno unsigned signed 11110000 CF=1, OF=0 11010000 208 48 01110000 112 112 01000000 64 64 inválido válido Interno unsigned signed 01100000 CF=0, OF=1 01100001 97 97 01110000 112 112 11010001 209 47 válido inválido Interno unsigned signed 10000000 CF=1, OF=1 11000100 196 60 10010001 145 111 01010101 85 85 inválido 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) bold itálica XOR bold = Overflow Flag (OF) Original unsigned signed interno 11001100 11000100 196 60 11000100 10010001 145 111 01101111 Diferencia 51 51 00110011 válido válido CF=0 OF=0 Original unsigned signed interno 00000000 01100001 97 97 01100001 01110000 112 112 10010000 Diferencia 241 15 11110001 inválido válido CF=1 OF=0 Original unsigned signed interno 10011000 10001101 141 115 10001101 01101000 104 104 10011000 Diferencia 37 37 00100101 válido inválido CF=0 OF=1 Original unsigned signed interno 01100000 01100001 97 97 01100001 10010000 144 112 01110000 Diferencia 209 47 11010001 inválido inválido CF=1 OF=1 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 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) La suma de dos cantidades de diferente signo es siempre válida (OF = 0)
Reglas de validez X 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 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) La suma de dos cantidades de diferente signo es siempre válida (OF = 0)
Resumiendo ADD bold itálica = Carry Flag (CF) bold itálica XOR bold = Overflow Flag (OF) SUB NOT bold itálica = Carry Flag (CF) 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.