0+0=0 0+1=1 1+0=1 1+1=10 10+1=11
Registros de Propósito General
AX, Acumulator: Sirve para hacer todas las operaciones aritméticas, y algunas, como Multiplicar y Dividir, le son exclusivas. AX (y AL por su versión de un solo byte) son los únicos registros que pueden ser multiplicados y divididos por otro registro. La resta de AX y AL, por ejemplo, ocupan un byte menos que la de cualquier otro registro, pero esto no es para preocuparse, un byte, realmente no es nada, por más que se acumule.
BX, Base Index: Sirve para ser usado como registro de base para un índice o array, es decir, una posición de memoria puede ser apuntada por BX (su offset), igualmente también se lo puede usar para hacer sumas, restas y todo tipo de operaciones lógicas. AX, CX y DX no sirven para apuntar a memoria.
CX, Counter: Es el registro reservado para contar, como su nombre lo indica. Para este propósito hay órdenes especiales que lo decrementan o incrementan y hacen algo según el resultado. También hay ciertas órdenes repetitivas que necesitan saber cuánto repetirse, por medio de CX (o CL en su versión Byte) se les indica.
DX, Data: Este registro no tiene definido un uso, en general es utilizado para pasar ciertos parámetros, pero sí cumple una función, por ejemplo en la multiplicación, si se multiplica AX=1000h (un Word) por, simplemente 10h (un Byte) el resultado es 00010000h (Un DWord), entonces, el Word Alto del resultado de la multiplicación se deposita en DX, y el Bajo en AX.
SI, Source Index: Puede ser utilizado como índice a posiciones de memoria, es decir se puede poner un número en SI (Offset) y leer el dato de esta posición. Pero a la vez tiene una función específica, la de Registro Fuente para las órdenes de tratamiento de cadenas. Hay ciertas órdenes en Assembler que son para, por ejemplo mover toda una cadena de bytes, de un lugar a otro, la dirección de la cual se leen los bytes se pone en SI antes de decir que lea.
DI, Destination Index: Como SI, puede ser usado como índice. Pero su función específica es la de Registro de Destino para las operaciones de cadena, lo que se lee de el contenido de SI (no de SI mismo, sino de la posición de memoria a la que apunta SI) es depositado en la posición de memoria a la que apunta DI, expresada por [DI]. A la vez, igual que con SI, se pueden hacer operaciones aritméticas simples (suma y resta), y también todo tipo de operaciones lógicas (AND, OR, XOR).
BP, Base Pointer: Puntero a una posición de memoria, muy parecido a BX, pero generalmente usado para facilitar el pasaje de parámetros en funciones hechas con lenguajes de alto nivel, por una característica propia que ya voy a explicar.
SP, Stack Pointer: Puntero que indica en qué Offset termina el Stack, o pila. El Stack, es un área de la memoria principal de la máquina, (no está dentro del Micro, ni tampoco es fija) que sirve para preservar cosas, la estructura del Stack, que ya explicaré más a fondo, es simple, esta estructura es llamada LIFO (Last In First Out) o lo que es lo mismo, lo último que entra, es lo primero que sale, es como si tuviéramos una pila de cosas, lo último que apoyamos arriba va a ser lo primero que podamos sacar después. Si no está claro, no se preocupen, ya voy a explicarlo bien, y voy a decir para qué se usa, y cuándo.
IP, Instruction Pointer: El puntero de instrucción es el que le indica al Micro cuál va a ser la próxima instrucción que debe ejecutar (Solo el Offset). El programa en Assembler tiene una estructura lógica, la cual se puede seguir. IP comienza al principio del programa (la próxima orden que se debe ejecutar es la primera del programa), se ejecuta esa orden e IP es incrementado tanto como Bytes ocupe la orden recién ejecutada (no todas las órdenes ocupan un byte) luego sigue con la próxima y así sucesivamente. Si pudiéramos de alguna forma cambiar el contenido de IP lo que estaríamos haciendo sería una desviación, o un Jump (salto) a otro lado del programa, y efectivamente se puede hacer esto, pero no diciendo IP = 1234h, sino haciendo un salto, que es equivalente a esto último: JMP 1234h. Ya lo voy a explicar, esto también.
Registros de Segmento
CS, Current Segment: Es el Segmento actual de ejecución, juntos CS:IP apuntan a la próxima orden que el Micro debe leer para ejecutar
DS, Data Segment: Es el segmento destinado a ser usado junto con BX, SI y DI para apuntar a una dirección de memoria. También puede ser usado con BP y SP, pero hace falta expresarlo concretamente. (Más adelante aclaro esto)
ES, Extra Segment: Es un segmento Extra para ser utilizado cuando haga falta. También tiene una función propia: Junto con DI indican el destino en las «órdenes de cadena» (el dato leído de DS:SI es puesto en ES:DI, en las ordenes de movimiento).
SS, Stack Segment: El segmento de Stack; junto con SP apuntan a la última posición que fue utilizada para «depositar» datos en el Stack.
Registro de Banderas (Flags)
Flags: Es un registro especial en el cual se guardan los resultados de la última operación matemática o de comparación. No se guardan los resultados numéricos, solo los de estado.
Flag | Nombre | Descripción |
---|---|---|
CF | Carry Flag | Bandera de Acarreo |
PF | Parity Flag | Bandera de Paridad |
AF | Auxiliary Flag | Bandera Auxiliar |
ZF | Zero Flag | Bandera por Cero |
SF | Sign Flag | Bandera de Signo |
TF | Trap Flag | Bandera de Paso Simple |
IF | Interrupt Flag | Bandera de Interrupción |
DF | Direction Flag | Bandera de Dirección |
OF | Overflow Flag | Bandera por Sobre flujo |
IOPL | I/O Privilege Level | Solo en 286 o superior |
NT | Nested Task Flag | Solo en 286 o superior |
RF | Resume Flag | Solo en 386 o superior |
VM | Virtual Mode Flag | Solo en 386 o superior |
Preguntas y Respuestas
– ¿Cuál es el contenido informativo de una instrucción?
El contenido informativo de una instrucción son direcciones de memoria, que contiene los datos que luego serán utilizados por dicha instrucción.
– ¿Por qué las instrucciones de una secuencia deben estar en posiciones consecutivas y los datos no?
Porque es la única manera que tiene la máquina de poder ejecutar instrucciones consecutivas y poder encontrar la siguiente instrucción. Los datos no requieren esta condición ya que son accedidos y leídos mediante direcciones de memoria.
– ¿Por qué en el tp2 y tp3 se usan los mismos códigos de operación?
Por 2 motivos: porque los enteros se representan mediante naturales y porque las cuentas de naturales tienen internamente cuentas de enteros.
– Cuando en un computador se debe hacer b – (-q) ¿qué parte del sistema hace la resta y qué parte concreta el número negativo?
El número dentro del paréntesis es el que se hace primero para poder guardar el valor en la memoria, luego se procesa el de afuera del paréntesis en la UAL (Unidad Aritmética Lógica).