Agregado de paridad par a caracteres ASCII

Transcripción

Agregado de paridad par a caracteres ASCII
ARQUITECTURA DE COMPUTADORES I
Ejercitación sobre el procesador 68000
Ejercicio 1
Agregado de paridad par a caracteres ASCII
Tenemos una tabla de caracteres ASCII (valores entre 00 hex y 7F hex), y
queremos utilizar el bit 7 -carente de significado en el valor ASCII- de cada byte
de la tabla como bit de paridad, de manera tal que se cumpla que la cantidad de
1’s incluido el bit de paridad en cada byte de la tabla es un valor par.
Suponemos que la tabla empieza en la dirección $5000 y que el primer par de
bytes indica la longitud de la tabla en bytes o en número de caracteres e
inmediatamente a continuación se encuentra la secuencia de códigos ASCII en
cuestión. Entonces se debe escribir un programa que agregue el bit de paridad en
cada carácter, es decir, si debe ser “0” queda igual y si debe ser “1” se coloca el
“1” en el bit 7.
Sugerencias:
 Usar un registro de direcciones como puntero para recorrer la tabla con el
modo de direccionamiento de registro de direcciones postincrementado.
 Usar la instrucción DBRA para establecer un lazo de iteraciones en
función de la longitud de la tabla.
 Analizar bit a bit cada byte de la tabla, por ejemplo, usando instrucciones
de corrimiento y enviando el bit al Carry y al flag de extensión X, y
llevando la cuenta de 1’s hallados en un registro de datos, hasta que el
byte quede con todos 0’s (se puede usar la instrucción TST sobre el
registro que se está desplazando para comprobar esto), lo cual indica que
ya no se debe seguir corriendo.
 Se puede testear el bit 0 del registro que contó los 1’s para saber si el
número de 1’s hallados es par o impar usando la instrucción BTST y
examinando luego el flag Z. Por ejemplo BTST.L #0, D0.
 En función de lo anterior se procederá a colocar un “1” en el bit 7 o no. Se
podrá usar la instrucción BSET con este fin, que tiene una sintaxis similar
a BTST (ver set de instrucciones).
Ejercicio 2
División con desborde
Es sabido que efectuar la división de un dividendo de 32 bits por un divisor de
16 no siempre va a dar un cociente de 16 bits. Puede suceder que este cociente
supere los 16 bits generando así una división con desborde, como consecuencia
1
de lo cual la instrucción de división en el 68000, DIVU, no obtendrá el
correspondiente cociente, indicando esta situación mediante un “1” en el flag de
desborde V.
La sintaxis de la instrucción DIVU es DIVU fuente,Dn donde el destino
siempre debe ser un registro de datos. Por ejemplo podemos tener DIVU D0,D1
donde D1 representa el dividendo de 32 bits y D0 en su palabra menos
significativa el divisor de 16 bits. Si no hay desborde el cociente de 16 bits
ocupará la palabra menos significativa de D1, y el resto, también de 16 bits, la
más significativa (ver set de instrucciones). Si hay desborde tanto D1 como D0
quedan sin modificar.
Nota: Tener en cuenta que estamos hablando siempre de división sin signo.
Entonces, en caso de desborde se podría resolver la división como dos
divisiones con un cociente asegurado de 16 bits para cada una, o sea, sin
desborde alguno, obteniéndose por separado los 16 bits más significativos llamémoslo Q1- y los 16 menos significativos -llamémoslo Q0- del cociente de
32 bits.
Llamemos Y1 e Y0 a las palabras alta y baja del dividendo de 32 bits de manera
que el dividendo se puede expresar como Y1x216 + Y0.
Llamemos X al divisor de 16 bits.
Podemos expresar la división como (Y1x216 + Y0)/X = Y1x216/X +Y0/X donde
el primer término es igual a Q1x216 con resto R1x216, donde llamamos Q1 al
cociente de la división de Y1 por X, y R1 al resto de dicha división.
De este modo la división queda Q1x216 + R1x216/X + Y0/X
...o sea Q1x216 + (R1x216 + Y0)/X
donde podemos llamar al cociente de la división expresada en el último término
Q0 y al resto R0, ambos de 16 bits como máximo, ya que R1x216/X es menor
que 216 porque R1 es menor que X e Y0/X es menor que 216 porque ambos son
de 16 bits.
Resumiendo:
A partir de un dividendo de la forma Y1 Y0, debemos efectuar la división
0 Y1 /X para obtener Q1 y el resto R1, y luego
R1 Y0 /X para obtener Q0 y el resto R0
donde 0 Y1 es una palabra alta integrada íntegramente por 0’s y una palabra baja
que es Y1, y R1 Y0 es de la misma manera una palabra alta igual a R1 y una
baja igual a Y0.
En definitiva el resultado de la división que es
Q1x216 + (R1x216 + Y0)/X
se puede expresar como una palabra alta Q1 y una baja Q0, y con un resto R0
...o sea de la forma Q1 Q0.
Entonces se puede elaborar un programa que sea capaz de efectuar una división
sin signo, tanto si no hay desborde, como si lo hay. El programa deberá
2
inspeccionar el flag V luego de la división para efectuar el método arriba
descripto si V fue “1”.
Puede ser de utilidad el uso de la instrucción SWAP para intercambiar palabra
alta y baja de un registro de datos, lo cual puede ser necesario, y cuya sintaxis es
simplemente SWAP Dn donde Dn es un registro de datos cualquiera.
El objetivo es obtener en un registro de datos el resto de la división, y en otro
registro el cociente, ya sea de 16 bits (no desborde), o de 32 bits (desborde) en
su forma Q1 Q0.
3

Documentos relacionados