pbn - 09 - 1 © jaime alberto parra plaza clase 9 instrucciones aritmÉticas. generaciÓn de...

Post on 28-Jan-2016

220 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

PBN - 09 - 1© Jaime Alberto Parra Plaza

CLASE 9

INSTRUCCIONES ARITMÉTICAS.

GENERACIÓN DE EXPRESIONES

PBN - 09 - 2© Jaime Alberto Parra Plaza

La instrucción básica en programación es la asignación mediante la cual se ordena a una variable tomar determinado valor. Físicamente esto corresponde a escribir en una posmem el valor indicado.

En forma general, el valor se obtiene al evaluar una expresión. Un ejemplo sería:

z = a * b / ( sin(c) + 1/d )

PBN - 09 - 3© Jaime Alberto Parra Plaza

EXPRESIONES:Una expresión se construye realizando

operaciones entre variables y constantes.

Las operaciones son del tipo: operador aritmético, evaluación de función, búsqueda en tabla, etc.

Una expresión siempre produce como resultado una constante que se obtiene cambiando cada variable por su valor actual y evaluando el conjunto.

PBN - 09 - 4© Jaime Alberto Parra Plaza

Un microprocesador convencional sólo viene dotado para realizar operaciones aritméticas.

Para el caso del 8086, los operandos sólo pueden ser de tipo carácter o de tipo entero, esto significa que si se desea realizar operaciones sobre números reales o funciones como raíz cuadrada o tangente, debe crearse una función específica para hacer tal labor.

PBN - 09 - 5© Jaime Alberto Parra Plaza

INSTRUCCIONES ARITMÉTICAS:

a. Suma:

ADD, ADC, INC, AAA, DAA

b. Resta:

SUB, SBB, DEC, NEG, CMP, AAS, DAS

c. Multiplicación:

MUL, IMUL, AAM

d. División:

DIV, IDIV, AAD, CBW, CWD

PBN - 09 - 6© Jaime Alberto Parra Plaza

INSTRUCCIÓN DE SUMA (ADD):

Sintaxis:ADD destino, origen

Propósito:Suma destino y origen y guarda el resultado en destino.

Ejemplos: ADD AX, BX ADD AX, var16 ADD BYTE PTR [SI], cte8 ADD WORD PTR [BX],

cte16 ADD CL, CH

PBN - 09 - 7© Jaime Alberto Parra Plaza

INSTRUCCIÓN DE INCREMENTO (INC):

Sintaxis:INC destino

Propósito:Destino se incrementa en 1.

Ejemplos: INC DHINC var16INC [BX][DI]

PBN - 09 - 8© Jaime Alberto Parra Plaza

INSTRUCCIÓN DE RESTA (SUB):

Sintaxis:SUB destino, origen

Propósito:Resta de destino a origen y guarda el resultado en destino.

Ejemplos: SUB AL, cte8 SUB WORD PTR [DI], cte16

SUB BYTE PTR var8[BX], cte8 SUB CX, BX

PBN - 09 - 9© Jaime Alberto Parra Plaza

INSTRUCCIÓN DE DECREMENTO (DEC):

Sintaxis:DEC destino

Propósito:Destino se decrementa en 1.

Ejemplos: DEC ALDEC var16DEC var8[SI]

PBN - 09 - 10© Jaime Alberto Parra Plaza

INSTRUCCIÓN DE MULTIPLICACIÓN SIN SIGNO (MUL):

Sintaxis:MUL operando

Propósito:Multiplica el operando con el acumulador y guarda el resultado en el acumulador.

Ejemplos: MUL var8MUL CXMUL var16MUL var8[SI][BI]

PBN - 09 - 11© Jaime Alberto Parra Plaza

El nombre acumulador se aplica a tres entidades: AL, AX y la pareja DX,AX. Se sobreentiende cual es a partir del tamaño de los operandos implicados.

AL es el acumulador de 8 bits (Acc8), AX lo es para operaciones de 16 bits (Acc16) y DX,AX lo es para 32 bits (Acc32). De aquí surge que la multiplicación tenga dos casos:

PBN - 09 - 12© Jaime Alberto Parra Plaza

Caso a: Multiplicación sobre bytes:

MUL oper8

Acc16 AL * oper8

Caso b: Multiplicación sobre words:

MUL oper16

Acc32 AX*oper16

PBN - 09 - 13© Jaime Alberto Parra Plaza

INSTRUCCIÓN DE MULTIPLICACIÓN CON SIGNO (IMUL):

Igual a MUL, pero los operandos se asumen signados.

PBN - 09 - 14© Jaime Alberto Parra Plaza

Ejemplo de multiplicación sin signo:

MUL BL

AH AL BL

antes ??H 45H 82H

después

PBN - 09 - 15© Jaime Alberto Parra Plaza

Ejemplo de multiplicación sin signo:

MUL BL

AH AL BL

antes ??H 45H 82H

después 23H 0AH 82H

PBN - 09 - 16© Jaime Alberto Parra Plaza

Ejemplo de multiplicación con signo:

IMUL BL

AH AL BL

antes ??H 45H 82H

después

PBN - 09 - 17© Jaime Alberto Parra Plaza

Ejemplo de multiplicación con signo:

IMUL BL

AH AL BL

antes ??H 45H 82H

después DEH 0AH 82H

PBN - 09 - 18© Jaime Alberto Parra Plaza

INSTRUCCIÓN DE DIVISIÓN SIN SIGNO (DIV):

Sintaxis:DIV operando

Propósito:Divide el acumulador entre el operando y guarda el resultado en el acumulador.

Ejemplos: DIV var8DIV CXDIV var16DIV var8[SI][BI]

PBN - 09 - 19© Jaime Alberto Parra Plaza

Caso a: División word/byte:

DIV oper8

AL Acc16 / oper8

AH Acc16 % oper8

Caso b: División double/word:

DIV oper16

AX Acc32 / oper16

DX Acc32 % oper16

PBN - 09 - 20© Jaime Alberto Parra Plaza

INSTRUCCIÓN DE DIVISIÓNCON SIGNO (IDIV):

Igual a DIV, pero los operandos se asumen signados.

PBN - 09 - 21© Jaime Alberto Parra Plaza

Ejemplo de división sin signo:

DIV BL

AH AL BL

antes 12H 45H 82H

después

PBN - 09 - 22© Jaime Alberto Parra Plaza

Ejemplo de división sin signo:

DIV BL

AH AL BL

antes 12H 45H 82H

después 7FH 23H 82H

PBN - 09 - 23© Jaime Alberto Parra Plaza

Ejemplo de división con signo:

IDIV BL

AH AL BL

antes 12H 45H 82H

después

PBN - 09 - 24© Jaime Alberto Parra Plaza

Ejemplo de división con signo:

IDIV BL

AH AL BL

antes 12H 45H 82H

después 0FH DBH 82H

PBN - 09 - 25© Jaime Alberto Parra Plaza

EXPRESIONES ARITMÉTICAS:

Una expresión aritmética consta de constantes y variables operadas mediante sumas, restas, multiplicaciones y divisiones, tal como la siguiente:

a + b * (5 - c/2) + (7 - x) / (y + 4)

PBN - 09 - 26© Jaime Alberto Parra Plaza

Las expresiones son útiles en un lenguaje de programación para realizar asignaciones y para realizar condiciones que permiten tomar decisiones.

Ejemplo:

z = a + 5*x; /* expresión de asignación */

if (b + c > d*3 - 9) /* expresión condicional */

PBN - 09 - 27© Jaime Alberto Parra Plaza

La clave para poder implementar una expresión en ensamblador es entender que el microprocesador sólo puede manejar una variable al tiempo. En consecuencia, una expresión que contenga N variables requerirá, como mínimo, de N instrucciones del microprocesador para llevarla a cabo.

PBN - 09 - 28© Jaime Alberto Parra Plaza

EJEMPLO 1: int x, y, z;z = x + y;

Aquí se tienen 3 variables, o sea que se requerirán 3 o más instrucciones. El orden de tareas es:

• Primero hacer la suma

• Luego la asignación

PBN - 09 - 29© Jaime Alberto Parra Plaza

• Suma:

Como son dos variables, se debe guardar una en un registro y después hacer la suma con la otra. La suma debe hacerse de forma que el destino sea un registro para que no se altere el valor original de las variables:

MOV CX, xADD CX, y

PBN - 09 - 30© Jaime Alberto Parra Plaza

• Asignación:

Puesto que el resultado final de la expresión siempre debe quedar en un registro, el paso último es transferir dicho valor a la variable que guardará el resultado:

MOV z, CX

PBN - 09 - 31© Jaime Alberto Parra Plaza

USO DE REGISTROS PARA EVALUAR EXPRESIONES:

Para evaluar una expresión es casi imperativo el uso de registros, por la limitación ya establecida de una sola variable en cualquier instrucción.

Es conveniente prestar atención a las siguientes recomendaciones:

PBN - 09 - 32© Jaime Alberto Parra Plaza

• La anchura del registro debe corresponderse con el tipo de la variable con que se relaciona.

En particular, se tienen registros de 8 y de 16 bits, válidos para interactuar con caracteres o enteros. Variables de más tamaño requieren conjuntos de registros.

PBN - 09 - 33© Jaime Alberto Parra Plaza

• Cuando las variables en juego son punteros o variables compuestas (arreglos, matrices, cadenas, estructuras, etc.) la indexación debe hacerse con los registros capacitados para tal fin:

BX, SI, DI y BP

PBN - 09 - 34© Jaime Alberto Parra Plaza

• Algunas operaciones sólo admiten el uso de registros específicos, así que debe tenerse en cuenta esto antes de asignar tareas a los diferentes registros.

En particular, se tiene que el acumulador es el registro requerido para multiplicación y división.

PBN - 09 - 35© Jaime Alberto Parra Plaza

• La evaluación de una expresión debe hacerse siguiendo el orden de precedencia típico para las operaciones matemáticas:

• Paréntesis• Función• Incremento/Decremento• Multiplicación/División• Suma/Resta

Si existen varias operaciones de la misma precedencia, se evaluarán de izquierda a derecha.

PBN - 09 - 36© Jaime Alberto Parra Plaza

• El resultado de una expresión debe ajustarse al tamaño de la variable destino, lo cual puede implicar el truncamiento del resultado, con pérdida de información. Esto no debe preocupar al momento de realizar la expresión, pues es tarea del programa (y obviamente del programador) evaluar posteriormente si el valor es correcto.

PBN - 09 - 37© Jaime Alberto Parra Plaza

• Por más compleja que sea una expresión, la cantidad de registros es suficiente para poder almacenar los resultados parciales, así que sólo en caso extremo se debe recurrir a la pila para tal efecto.

PBN - 09 - 38© Jaime Alberto Parra Plaza

EJEMPLO 2:char a[10], b[7][7], d;int w, x, y;

d = x * (a[5] - 4/(y-b[3][w]));

Como existen varios paréntesis, el contenido de cada uno se considera como una expresión en si mismo. Se empieza siempre evaluando el paréntesis más interno.

PBN - 09 - 39© Jaime Alberto Parra Plaza

Primer paréntesis:y - b[3][w]

Como b es una variable compuesta, se usa el direccionamiento basado-indexado. En BX se ubica el valor de la fila (3), afectado por el total de columnas. La w se coloca en SI o en DI. Puesto que este resultado debe usarse como operando más adelante, el registro donde se guarda queda inhabilitado para el resto de la expresión.

PBN - 09 - 40© Jaime Alberto Parra Plaza

MOV CL, BYTE PTR yMOV BX, 21MOV SI, wSUB CL, b[BX][SI]

El resultado se guarda en CL. Como y es una variable entera, se fuerza su cambio a char con el qualificador byte ptr.

PBN - 09 - 41© Jaime Alberto Parra Plaza

División: 4 / {resultado anterior}

Por ser una división, el dividendo debe ubicarse en el acumulador. Como se espera un resultado tipo byte, la división es de la forma word/byte.

PBN - 09 - 42© Jaime Alberto Parra Plaza

MOV AX, 4IDIV CL

Como las variables son signadas, se escoge la orden de división correspondiente; el resultado queda en AL. Puesto que la siguiente operación no es producto ni división no es necesario transferir este resultado a otro registro.

PBN - 09 - 43© Jaime Alberto Parra Plaza

Resta: a[5] - {resultado anterior}

a es una variable arreglo, pero el índice es una constante, así que no se requiere direccionamiento por registros.

PBN - 09 - 44© Jaime Alberto Parra Plaza

MOV CL, a[5]SUB CL, AL

CL ya había sido usado para albergar el primer paréntesis. A pesar de que existen otros registros vacíos se volvió a usar CL para indicar el método usual, que consiste en acostumbrarse a usar la menor cantidad posible de registros.

PBN - 09 - 45© Jaime Alberto Parra Plaza

Multiplicación: x * {resultado anterior}

Por ser un producto, necesariamente debe colocarse uno de los operandos en el acumulador. Se ubicará a x dado que el otro operando ya está en CL.

PBN - 09 - 46© Jaime Alberto Parra Plaza

MOV AL, BYTE PTR xIMUL CL

De nuevo se usa un casting para acondicionar los operandos al tamaño requerido.El resultado final está ahora en AL (a pesar de que el resultado del producto se ubica en AX).

PBN - 09 - 47© Jaime Alberto Parra Plaza

Asignación final: d = {resultado anterior}

Simplemente se transfiere el valor obtenido a la variable destino:

MOV d, AL

PBN - 09 - 48© Jaime Alberto Parra Plaza

PREGUNTA:

• ¿Qué ajustes deben realizarse para poder dividir números de igual longitud (es decir, byte/byte o word/word), para números con y sin signo?.

• ¿Qué mecanismo puede emplearse para dividir números de longitud mayor a 32 bits?

PBN - 09 - 49© Jaime Alberto Parra Plaza

< FIN DE LA CLASE 9 >

top related