Está en la página 1de 16

Sesión 2

Operaciones Aritméticas

Sesión 2 Operaciones Aritméticas Computadores II Rodrigo Santamaría

Computadores II Rodrigo Santamaría

Índice

Operaciones aritméticas

Suma, resta, multiplicación

Incremento, decremento

Depuración de programas

Ejercicio: multiplicación de 16 bits

Operaciones aritméticas

Incremento: la orden es INCA o INCB y suma una unidad a A o B, respectivamente

Decremento: igual que en el caso anterior hay dos versiones: DECA y DECB

Puesta a cero: CLRA (CLeaR A) y CLRB, equivalentes a LDA #0 y LDB #0, pero más rápidas

Negativo: NEGA y NEGB cambian de signo el valor que haya en A y B, respectivamente (hacen el complemento a dos)

Operaciones: suma

Suma: cuatro versiones

ADDA, ADDB, ADDD: sobre un registro, variable o dirección de memoria ADDA k → A=A+k

ABX: suma especial X=X+B (sin signo)

Suma con el bit de acarreo: ADCA y ADCB. Como ADDA y ADDB pero suman el bit de acarreo.

Operaciones: resta y multiplicación

Resta: SUBA, SUBB y SUBD sobre un registro, variable o dirección de memoria

SUBB k → B=B-k

Resta con acarreo: SBCA y SBCB, como SUBA y SUBB pero se resta el bit de acarreo

Extensión del signo: SEX (SignEXtension). Extiende el signo de B en A de modo que el registro D exprese el mismo número en complemento a dos

Multiplicación: MUL multiplica sin signo A por B y el resultado queda en D (D=A*B)

Resumiendo

INCA → A=A+1

DECB → B=B-1

CLRA → A=0

NEGB → B=-B ADDA x → A=A+x

SUBD x → D=D-x

MUL → D=A*B

Ejemplo

Suma de dos números de 16 bits: 16+35

0x100

1

0x101

6

0x102

3

0x103

5

0x100

1

0x101

6

0x102

3

0x103

5

lda 0x101

A 6 C ? A 1 adda 0x103 C 1 lda 0x100 A 1 C
A
6
C
?
A
1
adda 0x103
C 1
lda 0x100
A
1
C
1
A
5
adca 0x102
C
0
0x106 0 0x107 1
0x106
0
0x107
1

sta 0x107

0x106

5

0x106 5

0x107

1

sta 0x106

Depuración

Hace falta añadir la opción -a de ensamblado

as6809 -a -o suma.asm

Hace falta añadir al enlazador la generación de un mapa de símbolos (-m) en formato ancho (-

w)

aslink -s – m -w suma.rel

Esto genera un mapa (suma.map) que utilizará para la depuración

Depuración

Al ejecutar el código, si existe un fichero .map, se ejecuta en modo depuración (dbg – debug) en el que podemos usar las órdenes:

l: lista el programa

b: indica un punto de ruptura donde PC debe parar

Por ejemplo: b 0x013D

bl: lista los puntos de ruptura establecidos

d: borra todos los puntos de ruptura

c: continuar con la simulación

s: continuar sólo con la siguiente línea (step)

q: abandona la simulación

Ejemplo 2

Sumar dos números de 16 bits

Copiar y ejecutar el programa

Comprobar que funciona correctamente mediante el depurador

Ejercicio 4

Restar dos números de 16 bits

Basarse en el ejemplo 2

Comprobar que funciona correctamente mediante el depurador

Ejercicio 5

Sumar a un número de 16 bits

Un número de 8 bits sin signo

Un número de 8 bits con signo

Hacer uso del registro X donde sea necesario

Pista: instrucción SEX

Ejercicio 6

Multiplicar dos números de 16 bits

Mediante la orden MUL

Y el algoritmo de multiplicación tradicional

El resultado será un número de 32 bits que puede almacenarse como 2 palabras de 16 bits, una para la parte alta y otra para la baja

Multiplicación de dos números de 16 bits

Como una multiplicación normal:

5024

5024

x x

1911 1911

5024

0005024 +

0050240

4521600 45216

5024000 5024

5024

9600864

multiplicación normal: 5024 5024 x x 1911 1911 5024 000 5024 + 00 5024 0 45216

c

Multiplicación de dos números de 16 bits

Sean 2 números de 16 bits: 1911 y 5024

En hexadecimal:

0x0777 y 0x13A0

MUL multiplica dos registros de 8 bits (A,B) en uno de 16 (D)

En registros de 8 bits:

 

07 77 y 13 A0

07 77 x 13 A0

0A*77

A0*07

13*77

13*07

 

4A 60

 

04

60

08

D5

00

85

00

92 7F 60

A0 07 77 x 13 A0 0A*77 A0*07 13*77 13*07   4A 60   04 60

c

Multiplicación 16 bits

Variables:

4 variables de 16 bits para los valores intermedios

2 variables de 16 bits para el resultado

1 variable de 8 bits para CC

Proceso

Hacer las 4 multiplicaciones intermedias de 8 bits

Y almacenar los resultados en las variables de 16

Hacer sumas de las tres partes menos significativas

Rellenando con ceros a la derecha (B)

Almacenando bit de acarreo en una variable (TFR + ST)

Hacer sumas de las tres partes más significativas

Rellenando con ceros a la izquierda (A)

Y sumar bit de acarreo (LD+TFR)