5-2-2014
Similar a las variables. Un registro es una zona especial en la memoria de nuestro procesador donde podemos almacenar y consultar un valor único. Con la salvedad de que existen un número limitado de ellos y cada uno tiene un cometido específico. Destacamos dos funcionalidades de uso común para este tipo de registro: Almacenar el valor de retorno de una función y utilizarlo como contenedor para resolver sencillas operaciones matemáticas. Es un registro volátil, dado que su valor no es almacenado. A pesar de que se establezca el valor de retorno de una función al contenido del mismo. Suele utilizarse como apoyo para acelerar el cálculo de operaciones. Es un registro no volátil. Registro volátil que puede ser utilizado como contador de bucle o contenedor de parámetros que sean pasados a funciones ); Registro volátil usado mayormente como parámetro para funciones. Normalmente se usa también para almacenar variables a corto plazo dentro de una función. Registro no volátil que normalmente es usado como puntero. Es utilizado por aquellas funciones que requieren un origen y un destino para los datos que se utilizan. Apuntando este al origen en todo momento. Al igual que el registro ESI, es no volátil y usado como puntero, a diferencia de que este apunta al destino siempre. Registro no volátil con dos usos comunes según el compilador que utilicemos, así puede desempeñar el papel de un registro como otro cualquiera o ser el puntero al marco de pila. Almacena un puntero a la parte inferior de la pila. Tras ejecutar una función el valor que tenía el registro al principio debe de coincidir con el asociado tras la función El puntero de instrucciones es un registro de 32 bits llamado EIP, el cual mantiene el offset de la próxima instrucción a ejecutar. El offset (desplazamiento de dirección de memoria) siempre es relativo a la base del segmento de código (CS). Estos registros de 32 bits a su vez pueden ser divididos en registros de menor tamaño (16 bits, y 8 bits, distinguiendo la parte superior e inferior).
pág. 1
Por tanto tenemos:
8 registros de 32 bits: EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP EIP 8 registros de 16 bits: AX, BX, CX, DX, SI, DI, BP, SP, IP 8 registros de 8 bits: AH, AL, BH, BH, BL, BL, CH, CL, DH, D
Se puede trabajar solamente con partes del registro por ejemplo AX representa una parte de 8 bits de tamaño de Accumulator Register, pero si quisiéramos trabajar con los 32 bits del registro agregamos la letra "E" al inicio del nombre ("EAX") y para registros de 64 bits se utilizaría la letra "R"("RAX") Registro
Uso
Detalle
Partes
RAX
Acumulador
Operando en sumas, multiplicaciones, divisiones cadenas, comparaciones e intercambios, traducción en tablas y operaciones de E/S. Con RDX mantiene operandos de doble precisión.
EAX, AX, AL
RBX
Base Contador
Generación de direcciones en modo 16 bits ndice de bit en operaciones de rotación y cambio. Contador de iteraciones en ciclos. Saltos condicionales si es Zero
EBX, BX, BL
Dirección E/S Índice Fuente
Operando en multiplicaciones y divisiones Dirección en memoria fuente en operaciones de cadena. Índice en direcciones de 16 bits
EDX, DX, DL
RCX
RDX RSI
RDI
ndice Destino
RBP
Apuntador Base Apuntador Pila
ECX, CX, CL
ESI, SI, SIL
Dirección en memoria destino en operaciones de cadena. Índice en direcciones de 16 bits
EDI, DI, DIL
Dirección en memoria del apuntador base a la pila Dirección en memoria del tope de la pila Sin usos implícitos
EBP, BP, BPL
R11
Mantiene valor de banderas en SYSCALL y SYSRET
R11D, R11W, R11L
R12-R15
Sin usos implícitos.
R12D-R15D, R12W-R15W, R12L-R15L
RSP R8-R10
pág. 2
ESP, SP, SPL R8D-R10D, R8W-R10W, R8L-R10L