next up previous contents
Next: Instrucciones de transferencia de Up: El Set Instrucciones de Previous: El Lenguaje Ensamblador del   Contents

Instrucciones aritméticas y Lógicas.

"En verdad, deben existir instrucciones para realizar las operaciones aritméticas fundamentales".

Burks, Goldstine y Von Neumann, 1947.

En general, las instrucciones (de máquina) de un procesador constituyen las órdenes o comandos para decirle al hardware lo que tiene que hacer. En general también, hay que hablar en el idioma que habla o entiende el computador para que éste pueda seguir y ejecutar las órdenes dadas. Veremos luego, y con más detalle, un set de instrucciones real que es común en procesadores RISC reales. Una instrucción es una orden y tiene un significado para la máquina, ésta indica la operación a ejecutar y los operandos o datos a procesar. Comúnmente, una instrucción puede tener uno o más operandos, los cuales vienen con la instrucción o deben ser extraídos desde la memoria. Por ejemplo, una instrucción de suma siempre tiene dos operandos y un lugar donde colocar el resultado.
"Es fácil ver por los métodos lógicos normales, que existen ciertos set de instrucciones que en abstracto son adecuados para controlar y lograr la ejecución de cualquier secuencia de operaciones... Las consideraciones realmente decisivas desde el punto de vista actual para seleccionar un set de instrucciones son más de naturaleza práctica: simplicidad de la estructura exigida por el set de instrucciones y la claridad de su aplicación a los problemas realmente importantes junto a la velocidad de manipulación de esos problemas".

Burks, Goldstine y Von Neumann, 1947.

Como se señaló anteriormente, la cantidad de operandos que puede contener una instrucción varía, pero acá veremos instrucciones que pueden llegar a tener hasta tres operandos, especialmente las instrucciones de tipo aritmética y lógica. Un principio importante que se debe dejar en claro, es que los operandos de las instrucciones aritméticas y lógicas no pueden ser variables de memoria, éstos deben proceder de otros elementos internos del procesador denominados registros. Los registros son posiciones de almacenamiento especiales generalmente del tamaño de una palabra (4 bytes o 32 bits). Los registros constituyen los ladrillos con los cuales se construye el computador. Como se señaló anteriormente, estos son limitados.

Ejemplo 1.

Supongamos que deseamos realizar la siguiente suma, a través de una instrucción en lenguaje C:

s = (f + g) - (k + n);

Las variables de memoria s, f, g, k y n pueden ser asignadas a los registros $16, $17, $18, $19 y $20, respectivamente. El código en lenguaje assembly es el siguiente:

add $8,$17,$18  # registro $8 contiene f+g
add $9,$19,$20  # registro $9 contiene k+n
sub $16,$8,$9   # s obtiene $8-$9 de $16.

El lenguaje assembly o ensamblador es un lenguaje simbólico (o mnemónico) que permite representar con símbolos o caracteres las instrucciones de máquina y los registros del procesador. Sólo nos vamos a familiarizar, por simplicidad, con este lenguaje para programar la máquina, y no con el verdadero lenguaje de máquina el cual está constituido sólo por ceros (0) y unos (1). De todas maneras, y por conveniencia, podemos llamar lenguaje de máquina al lenguaje assembly.
La instrucción add que se vió anteriormente, permite sumar dos elementos (contenidos en registros) y deja el resultado en otro elemento (otro registro). Por ejemplo, la instrucción add $8,$17,$18 significa sumar los contenidos de los registros $17 y $18 y dejar el resultado en el registro $8, similar a la instrucción sub la cual resta.
Las instrucciones div (división), mult (multiplicación), y las lógicas and, or, y xor, tienen un formato similar a la suma. A excepción de la instrucción not que sólo posee dos operandos. Por ejemplo, la instrucción not $8,$9 deja la negación lógica bit a bit del registro $9 (invirtiendo los bits) en el registro $8.
Las instrucciones aritméticas pueden manipular datos numéricos de tipo entero y real, en su representación punto fijo y punto flotante. Los datos de tipo entero son generalmente de cuatro bytes (es decir, una palabra completa según nuestro procesador y en lenguaje C se declaran como int, los enteros cortos (short int) ocupan 2 bytes, es decir, media palabra. Por último, hay enteros de un byte, que pueden ser manejados como un tipo char sin signo (unsigned char en lenguaje C), o como tipo byte en el lenguaje de programación JAVA. Los datos reales de simple y doble precisión pueden ocupar cuatro o más bytes cuando se utiliza la notación punto flotante. Un número en punto flotante (conocido también como notación científica), se compone de tres elementos o campos consecutivos: un signo, una mantisa, y un exponente, tal como se muestra a en el cuadro 7.2, donde:

$S$: Es el sigo del número.
$E$: Exponente normalizado
$M$: Mantisa


Table 7.2: Formato de un número en punto flotante.
     
$S$
$E$
$M$


que ocuparía 8 bytes (dos palabras) si es doble precisión. Por ejemplo, en el número real $4,53456 x 10^{-456}$ el elemento $S$ sería el signo $+$; el exponente $E = -456$; y la mantisa $M=4.53456$.
Por último, a modo de conclusión, todas las operaciones de tipo aritmético/lógicas se llevan a cabo sobre los registros.


next up previous contents
Next: Instrucciones de transferencia de Up: El Set Instrucciones de Previous: El Lenguaje Ensamblador del   Contents
Pedro Rodríguez M. 2003-09-10