TP4.pdf

11
INGENIERÍA EN SISTEMAS DE INFORMACIÓN 2013 ARQUITECTURA DE COMPUTADORAS Ing. Juan Carlos Ansaldi 1 Trabajo Práctico Nº4 Componentes de la Arquitectura Von Neumman Trabajando con los Registros y la Memoria Aclaración La mayor parte de los Trabajos Prácticos a realizar en la cátedra, no solamente constarán de ejercicios a resolver o preguntas por contestar, sino que trataremos de ir guiando el desarrollo de los mismos por medio de ejemplos y breves conceptos teóricos que se desarrollaran en las clases, y que forman parte del Trabajo Práctico. Debido a esto, las preguntas que deben responder en cada trabajo práctico aparecen a lo largo del mismo en letras cursivas negritas con su correspondiente número de orden a la izquierda. Introducir “programas” con Debug Como a partir de ahora tendremos más de una instrucción, y la introducción de las instrucciones las estamos realizando directamente en código de máquina (números hexadecimales) tal como CDh 21h (INT 21), escribir estas instrucciones se torna complicado. Para esto, el Debug incluye el comando A (Assemble, ensamblar), que nos permite introducir directamente la mnemotecnia, o instrucciones que nos resultan más fáciles de comprender y memorizar. Así que en vez de introducir los códigos de máquina en hexadecimal, a partir de ahora comenzaremos a utilizar el comando A. Por ejemplo, si deseamos escribir las instrucciones INT 21 e INT 20 en las posiciones 100h y 102h respectivamente, desde el indicador del Debug debemos ingresar: - A 100 [Enter] 11F5:0100 INT 21 [Enter] 11F5:0102 INT 20 [Enter] 11F5:0104 [Enter] Nota: El listado anterior es un ejemplo, y no se debe ejecutar. Mover datos a Registros Como vimos, para realizar operaciones aritméticas debemos asignar valores a registros. Para evitar tener que hacerlo utilizando la orden R del Debug, utilizaremos la instrucción MOV para cargar números en registros. Veamos como funciona moviendo números de un registro a otro: Primero introducimos, a partir de la dirección de memoria 0100h, en AX el valor 1234h por medio de la instrucción MOV AX, 1234 y en DX el valor ABCDh, por medio de MOV DX, ABCD. El comando del Debug que debemos utilizar para introducir las instrucciones es A 100, para ubicar los códigos a partir, como ya lo mencionamos, de la dirección 0100h. Escribamos en la próxima dirección, la instrucción MOV AH,DL y ejecutemos con T las tres instrucciones anteriores. - A 100 [Enter] 11F5:0100 MOV AX,1234 [Enter] 11F5:0103 MOV DX, ABCD [Enter] 11F5:0106 MOV AH,DL [Enter] 1) ¿Qué valores hay en los registros AX y DX? Si ahora introducimos MOV BX, AX en la dirección 0108h (que debería ser la próxima dirección libre) y lo ejecutamos con T... 11F5:0108 MOV BX,AX [Enter] 2) ¿Cuáles son los nuevos valores de los registros AX y BX? Veamos ahora los siguientes ejemplos:

Transcript of TP4.pdf

Page 1: TP4.pdf

INGENIERÍA EN SISTEMAS DE INFORMACIÓN –2013

ARQUITECTURA DE COMPUTADORAS

Ing. Juan Carlos Ansaldi 1

Trabajo Práctico Nº4 Componentes de la Arquitectura Von Neumman

Trabajando con los Registros y la Memoria

Aclaración

La mayor parte de los Trabajos Prácticos a realizar en la cátedra, no solamente constarán de ejercicios a

resolver o preguntas por contestar, sino que trataremos de ir guiando el desarrollo de los mismos por medio

de ejemplos y breves conceptos teóricos que se desarrollaran en las clases, y que forman parte del Trabajo

Práctico.

Debido a esto, las preguntas que deben responder en cada trabajo práctico aparecen a lo largo del mismo en

letras cursivas negritas con su correspondiente número de orden a la izquierda.

Introducir “programas” con Debug

Como a partir de ahora tendremos más de una instrucción, y la introducción de las instrucciones las estamos

realizando directamente en código de máquina (números hexadecimales) tal como CDh 21h (INT 21),

escribir estas instrucciones se torna complicado.

Para esto, el Debug incluye el comando A (Assemble, ensamblar), que nos permite introducir directamente

la mnemotecnia, o instrucciones que nos resultan más fáciles de comprender y memorizar. Así que en vez de

introducir los códigos de máquina en hexadecimal, a partir de ahora comenzaremos a utilizar el comando A.

Por ejemplo, si deseamos escribir las instrucciones INT 21 e INT 20 en las posiciones 100h y 102h

respectivamente, desde el indicador del Debug debemos ingresar:

- A 100 [Enter] 11F5:0100 INT 21 [Enter] 11F5:0102 INT 20 [Enter] 11F5:0104 [Enter]

Nota: El listado anterior es un ejemplo, y no se debe ejecutar.

Mover datos a Registros

Como vimos, para realizar operaciones aritméticas debemos asignar valores a registros. Para evitar tener que

hacerlo utilizando la orden R del Debug, utilizaremos la instrucción MOV para cargar números en registros.

Veamos como funciona moviendo números de un registro a otro:

Primero introducimos, a partir de la dirección de memoria 0100h, en AX el valor 1234h por medio de la

instrucción MOV AX, 1234 y en DX el valor ABCDh, por medio de MOV DX, ABCD. El comando del

Debug que debemos utilizar para introducir las instrucciones es A 100, para ubicar los códigos a partir,

como ya lo mencionamos, de la dirección 0100h.

Escribamos en la próxima dirección, la instrucción MOV AH,DL y ejecutemos con T las tres instrucciones

anteriores.

- A 100 [Enter] 11F5:0100 MOV AX,1234 [Enter] 11F5:0103 MOV DX, ABCD [Enter] 11F5:0106 MOV AH,DL [Enter]

1) ¿Qué valores hay en los registros AX y DX?

Si ahora introducimos MOV BX, AX en la dirección 0108h (que debería ser la próxima dirección libre) y lo

ejecutamos con T... 11F5:0108 MOV BX,AX [Enter]

2) ¿Cuáles son los nuevos valores de los registros AX y BX?

Veamos ahora los siguientes ejemplos:

Page 2: TP4.pdf

INGENIERÍA EN SISTEMAS DE INFORMACIÓN –2013

ARQUITECTURA DE COMPUTADORAS

Ing. Juan Carlos Ansaldi 2

Utilizando el comando A del Debug, ingresar las siguientes instrucciones:

11F5:0100 MOV AX,1000 11F5:0103 MOV BX,1010 11F5:0106 ADD AX,BX

3) ¿Qué realiza cada una de las instrucciones del listado anterior?. Detallar

En nuestro próximo ejemplo, veremos una forma diferente de escribir en los registros los datos a sumar.

Primero, utilizando el comando E del Debug hagamos lo siguiente:

-E 1000 [Enter] 11F5:1000 00.FF 11.00 [Enter] -E 1010 [Enter] 11F5:1010 EC.00 00.11 [Enter]

Luego, utilizando el comando A, introduzcamos las instrucciones:

- A 100 [Enter] 11F5:0100 MOV AX,[1000] 11F5:0103 MOV BX,[1010] 11F5:0107 ADD AX,BX 11F5:0109 MOV [1020],AX [Enter]

Para comprenderlo mejor, veamos el volcado de la memoria entre las direcciones 1000h y 1030h, utilizando

para ello el comando D de Debug, y el rango de memoria que queremos ver

-D 1000, 1030 [Enter] 11F5:1000 FF 00 A3 01 74 08 3C 0C-77 43 75 02 32 C0 2E F6 ....t.<.wCu.2... 11F5:1010 00 11 A3 04 74 0C 3C 0C-74 08 04 0C 72 2F 3C 18 ....t.<.t...r/<. 11F5:1020 FF 11 8A D0 2E A1 36 A4-0A E4 75 21 8A F0 2E A1 ......6...u!.... 11F5:1030 38

4) ¿Qué realizan las instrucciones que hemos ingresado en el paso anterior?. Detallar los pasos

realizados.

Interrupciones (INT)

Veamos ahora el funcionamiento de una interrupción de software. Para eso utilicemos el siguiente ejemplo:

1. Carguemos el DEBUG.

2. Escribamos, a partir de la dirección 0100h (NO con r) el valor 200h en AX y 41h en DX, utilizando el

comando A del Debug (A 100 [Enter]).

3. La instrucción INT de las funciones del DOS es INT 21h (en código de máquina: CDh 21h). Esta es una

instrucción de dos bytes. Escribamos dicha instrucción INT 21h, en la posición de memoria 106h,

utilizando el comando A del Debug. Recuerde que para poder ejecutar este pequeño programa, el registro

IP debe apuntar a la dirección 100h.

Veamos ahora que ocurre si utilizamos el comando T del Debug para ejecutar las instrucciones:

Como T ejecuta las instrucciones línea a línea, y la instrucción INT llama a un programa muy largo del

DOS, nos pasaríamos un buen rato presionando T, hasta que termine de ejecutarse la interrupción INT 21.

Para evitar esto, utilizamos el comando G (Go) del Debug, poniendo a continuación la dirección en la que

queremos parar: -G 108 El DOS a escrito el carácter A, y luego ha devuelto el control al nuestro pequeño programa.

¿Cómo sabía el DOS que tenía que imprimir la letra A?

El valor 02h del registro AH le dijo al DOS que imprimiese un carácter. Cualquier otro número que hubiese

en AH le diría al DOS que ejecute una función diferente.

Page 3: TP4.pdf

INGENIERÍA EN SISTEMAS DE INFORMACIÓN –2013

ARQUITECTURA DE COMPUTADORAS

Ing. Juan Carlos Ansaldi 3

En cuanto al carácter, el DOS utiliza el número que hay en el registro DL como código ASCII del carácter

que se va a imprimir. En DL habíamos almacenado el valor 41h; es decir, el código ASCII de la letra A.

5) ¿Cuáles son los pasos que debe seguir para imprimir la letra B? Enumérelos.

La Interrupción de salida (INT 20h)

INT 20h es otra instrucción de interrupción, e indica que queremos salir del programa, y en nuestro caso

devolverá el control al Debug.

Como ejemplo, agreguemos en la línea 102 el código CD 20 (INT 20), y ejecutemos las dos líneas por

medio de G.

NOTA: En las últimas versiones del DOS se presentan problemas con las INT 20h al ejecutar el

programa fuera del Debug. Por lo tanto utilizaremos la función 4Ch de la INT 21h como reemplazo de la

INT 20h.

6) ¿Qué es lo que obtenemos en la pantalla?

7) ¿Cuáles son las 4 (ó 5) instrucciones necesarias para escribir un “*” en la pantalla y devolver el

control al DOS?

Escribir una cadena de caracteres

Veamos un ejemplo del uso de interrupciones de software, cadenas de caracteres en ASCII y su

almacenamiento en la memoria. Escribamos el siguiente código en la dirección 0100h:

11F5:0100 MOV AH,09 11F5:0102 MOV DX,0200 11F5:0105 INT 21 11F5:0107 INT 20

En la dirección 0200h escribamos lo siguiente, utilizando la orden E 200, separando cada par de dígitos

hexadecimales por medio de un espacio, y terminando con Enter.

11F5:0200 51 75 65 20 65 73 20 65 73 74 6F 3F 24

Nota: Al ingresar una cadena de caracteres, se indica el final de la misma por medio del carácter “$” en la última posición.

8) ¿Qué hemos hecho en el ejemplo anterior? Explicarlo.

9) Realizar un pequeño programa que nos permita escribir los nombres de cada uno de los integrantes

del grupo en la pantalla, uno debajo del otro.

Por último, analicemos el siguiente segmento de código:

11F5:0100 MOV AX,4100 11F5:0103 MOV BX,0041 11F5:0106 ADD AX,BX 11F5:0108 MOV DL,AH 11F5:010A MOV AH,02

11F5:010C INT 21 11F5:010E MOV DL,AL 11F5:0110 INT 21 11F5:0112 INT 20

10)¿Qué ocurre si lo “corremos” por medio del comando G de Debug?. ¿Qué función cumple

cada una de las líneas del listado anterior, y a que se debe el resultado obtenido?

Page 4: TP4.pdf

INGENIERÍA EN SISTEMAS DE INFORMACIÓN – 2013

ARQUITECTURA DE COMPUTADORAS

Ing. Juan Carlos Ansaldi

4

La ALU: Desplazamientos. Operaciones Lógicas y Comparaciones

Introducción:

Hemos visto en prácticos anteriores operaciones aritméticas que se realizan en la ALU . Además de

estas operaciones, en la ALU también se realizan operaciones lógicas y desplazamientos. En este

práctico nos introduciremos a los dos últimos tipos de operaciones que realiza la ALU: operaciones

lógicas y desplazamientos.

Con tal propósito desarrollaremos ejemplos que emplean este tipo de operaciones.

Incluiremos también el concepto de “bucle” y veremos como la ALU realiza “comparaciones”, y

a partir de ellas los “saltos condicionales” pues nos serán de utilidad para el desarrollo de nuestras

aplicaciones.

EJEMPLO 1: IMPRIMIR NÚMEROS EN BINARIO Deseamos imprimir en nuestra pantalla números en binario. Contamos únicamente con el Debug y

nuestros escasos conocimientos (incluyendo los profesores) sobre instrucciones de

microprocesadores. Primeramente veamos qué es lo que necesitamos:

Rotaciones (Desplazamientos circulares) y el Indicador de Acarreo

1) ¿Qué pasaba cuando por medio de ADD AX, BX sumamos FFFFh y 0001h?

Resultado: Acarreo: Desbordamiento:

Habiendo “refrescado” nuestros conocimientos pasemos a una nueva instrucción:

Introduzcamos en la dirección 0100h RCL BL,1

y la parte baja del registro BX, BL el valor B7h.

Efectuemos varios “rastreos” por medio del comando T siempre sobre la instrucción que se

encuentra en la dirección 0100h (no olvidar llevar IP a 100 luego de cada ejecución), y veamos que

ocurre con los resultados, expresándolos en binario, para lo cual:

2) debemos llenar la siguiente tabla:

Acarreo Registro BL en binario BL en hexa Observaciones

3) ¿Qué realiza la instrucción anterior sobre el valor que tenemos en BL?

Sumar usando el Indicador de Acarreo

Ingresemos ahora la instrucción ADC AX,BX

en, por ejemplo 0104 y pongamos AX= FFFFh; BX=0001h, ejecutándola dos o tres veces.

4) ¿Qué pasa?, Cuál es la diferencia con ADD AX, BX? Explicarlo detalladamente.

Ingresemos ahora ADC DL,30

5) ¿Cuál es el resultado si DL=0 con y sin acarreo? Verifíquelo!!

6) ¿Cuál será la razón de que estemos sumando 30h? Sugerencia: Ver la tabla de códigos ASCII.

Bucles

Page 5: TP4.pdf

INGENIERÍA EN SISTEMAS DE INFORMACIÓN – 2013

ARQUITECTURA DE COMPUTADORAS

Ing. Juan Carlos Ansaldi

5

Interpretar línea a línea la siguiente lista de instrucciones:

0100 MOV BX,A3C5 0103 MOV CX,0008 0106 RCL BX,1

0108 LOOP 0106 010A INT 20

7) Para ello, ingresarlo y reastrearlo. ¿Cómo haría para ejecutarlo de una sola vez?

¿Cuáles son las conclusiones a las que arribaron?

Escribir un número binario

Antes de seguir, veamos cuales son las instrucciones que conocemos hasta ahora, tener en cuenta la

INT 21h con AH=02 (función 02) y AH=09 (función 09).

8) Realizar un resumen de todas las instrucciones que hemos visto, indicando que es lo que hace

cada una de ellas, y como varían los registros (cuando esto ocurra).

Ahora veamos cómo mostrar en la pantalla un número binario, partiendo de un número

hexadecimal:

Primero por medio del comando R del debug, ingresemos un número cualquiera (por ej. AA) en BL

y luego por medio del comando A del debug ingresemos el siguiente segmento de programa:

0100 MOV AH,02 0102 MOV CX,08 0105 MOV DL,00 0107 RCL BL,1

0109 ADC DL,30 010C INT 21 010E LOOP 0105 0110 INT 20

Ejecutemos por medio de T. Qué pasa cuando llegamos a INT 21? Es un problema que se nos

presenta que el Debug nos lo permite solucionar utilizando el comando P. “Ver usando el help del

Debug que es el comando P”.

9) Interpretar el programa anterior línea a línea y describir su funcionamiento.

10)¿Cuál es la modificación que debemos realizar para que nos imprima la letra “b” al final del

número en binario?

Para grabar nuestro pequeño programa:

a) Comando N: Introducimos un nombre con extensión COM.

b) Calculamos la longitud en bytes del programa en hexadecimal.

c) Guardamos esta longitud en el par de registros BX:CX.

d) Lo escribimos en el disco utilizando el Comando W.

Comparación y bits de estado. Una Breve Introducción

Recordemos que hemos estado usando los indicadores de estado y examinamos el indicador de

acarreo, el cual, en la pantalla del Debug está representado por CY o por NC.

Recordemos también que CY significa que el indicador de acarreo es 1; se suele decir

frecuentemente que está “activado”. NC significa que el indicador de acarreo es 0. En todos los

indicadores, 1 significa “verdadero” y 0 significa “falso”. Por ejemplo, si se ha efectuado una resta

con la instrucción SUB y el resultado es 0, el indicador conocido como “indicador cero” tendrá el

valor 1, es decir, verdadero y aparecerá como ZR (cero). En caso contrario, el indicador cero será 0:

en otras palabras, NZ (No Cero).

Tenemos otro indicador, llamado “indicador de signo”, que varía entre NG (negativo) y PL

(positivo), y tiene el valor 1 cuando un número es negativo en forma de complemento a dos.

Ahora ya estamos preparados para ver un juego de instrucciones llamadas instrucciones de “salto

condicional”. La instrucción JZ (Jump if Zero, saltar si es cero), por ejemplo, salta a una nueva

dirección sí el resultado del último cálculo aritmético es cero. Por tanto, si después de una

instrucción SUB ponemos JZ 15A, y si el resultado de la resta es 0, IP saltaría a -y comenzaría a

ejecutar- las instrucciones que comienzan en la dirección 15Ah, en lugar de hacerlo en la siguiente

Page 6: TP4.pdf

INGENIERÍA EN SISTEMAS DE INFORMACIÓN – 2013

ARQUITECTURA DE COMPUTADORAS

Ing. Juan Carlos Ansaldi

6

instrucción. Lo que hace la instrucción JZ es comprobar el indicador cero y, si está activado (ZR),

produce un salto. La instrucción opuesta a JZ es JNZ (Jump Not Zero, saltar si no es cero).

Ingresemos el siguiente ejemplo que usa una instrucción JNZ. 11F5:0100 MOV AX,0003 11F5:0103 SUB AX,0001

11F5:0106 JNZ 0103 11F5:0108 INT 20

Rastreemos (T) este programa, una instrucción cada vez, para ver cómo funcionan los saltos

condicionales. Hemos puesto la instrucción INT 20 al final del programa para que, si se introduce

por error el comando G, no se pase del final del programa. Esta es una buena costumbre preventiva.

11) Completemos ahora una tabla que contenga los valores de IP, AX y el “indicador cero”,

similar a la que se adjunta, por cada una de las ejecuciones anteriores.

IP AX Ind. Cero

Probablemente ya se habrán dado cuenta de que usar SUB para comparar dos números, como

acabamos de hacer, tiene el potencial efecto secundario, y no deseable, de cambiar el primer

número. Otra instrucción, CMP (Compare, comparar) nos permite efectuar la resta sin guardar el

resultado y sin cambiar el primer número. El resultado sólo se usa para activar indicadores, de

manera que podamos usar una de las muchas instrucciones condicionales después de una

comparación.

Para ver lo que sucede, pongamos el mismo número, F5h, en los registros AX y BX y utilicemos

la instrucción CMP:

11F5:0100 MOV AX,00F5 11F5:0103 MOV BX,00F5

11F5:0106 CMP AX,BX 11F5:0108 INT 20

12) ¿Qué ocurrió con el indicador cero?

13) ¿Qué valor contienen los registros AX y BX?

EJEMPLO 2: IMPRIMIR UN SOLO DÍGITO EN HEXADECIMAL Ahora vamos a usar la instrucción CMP y las instrucciones de salto imprimir un solo dígito

hexadecimal. Veamos cómo funciona el siguiente ejemplo. Para ello escribamos:

11F5:0100 MOV AH,02 11F5:0102 MOV DL,BL 11F5:0104 ADD DL,30 11F5:0107 CMP DL,3A

11F5:010A JL 010F 11F5:010C ADD DL,07 11F5:010F INT 21 11F5:0111 INT 20

Nota: Antes de “correr” el ejemplo anterior, leamos atentamente....

Puesto que cualquier número comprendido entre 0 y Fh es equivalente a un dígito hexadecimal,

podemos convertir el número en un solo carácter ASCII y después imprimirlo. Veamos los pasos

que son necesarios para efectuar la conversión.

Los caracteres ASCII comprendidos entre 0 y 9 corresponden a los valores comprendidos entre 30h

y 39h; sin embargo, los caracteres comprendidos entre la A y la F corresponden a los valores 41h a

46h (Ver la tabla de Caracteres ASCII). Aquí se nos presenta un problema. Estos dos grupos de

caracteres ASCII están separados por siete caracteres. Como resultado, la conversión a ASCII será

diferente para los dos grupos de números (0 a 9 y Ah a Fh), de forma que habremos de manejar cada

grupo de forma diferente.

La instrucción CMP, resta dos números (DL-3AH) para establecer los indicadores, pero no cambia

el registro DL.

Page 7: TP4.pdf

INGENIERÍA EN SISTEMAS DE INFORMACIÓN – 2013

ARQUITECTURA DE COMPUTADORAS

Ing. Juan Carlos Ansaldi

7

Por tanto, si el valor del registro DL es menor que 3Ah, la instrucción JL 10F salta a la instrucción

INT 21h de la posición de memoria 10Fh.

Pongamos un número hexadecimal de un solo dígito en el registro BL y rastreemos este ejemplo

para ver cómo funciona la instrucción CMP y cómo funciona nuestro algoritmo para convertir

números hexadecimales en ASCII.

Nota: Cuando ejecute las instrucciones INT, acuérdese de usar el comando P.

Comprobemos el funcionamiento del programa probando con los números 0, 9, Ah y Fh que son

particularmente adecuados porque cubren todas las condiciones que se pueden dar en cuanto a

límites.

Como nos queda un espacio en esta página, y a fin de evitar gastos innecesarios en copias,

aprovecharemos el referido espacio e investiguemos el funcionamiento de las operaciones lógicas. 11F5:0100 MOV AL,BA 11F5:0102 NOT AL 11F5:0104 MOV AH,FC 11F5:0106 OR AL,AH

11F5:0108 MOV BL,14 11F5:010A AND BL,19 11F5:010D XOR AL,BL 11F5:010F INT 20

14) Ejecutar el programa anterior, y completar la siguiente tabla.

AL Hexa AL Binario AH Hexa AH Binario BL Hexa BL Binario

15) Representar el programa anterior utilizando compuertas lógicas.

16) Realizar un sencillo programa que permita comprobar el teorema de “De Morgan”.

Instrucciones de Manejo de Bit

Instrucciones lógicas

AND Y Lógico

NOT Negación

OR O Lógico

XOR O Lógico Exclusivo

TEST Test/Comparación lógica de dos operandos

Instrucciones de Desplazamiento y de Rotación de Bits

RCL Rotar a la Izq. a través de acarreo RCR Rotar a la Derecha través de acarreo

ROL Rotar a la Izq. ROR Rotar a la Derecha

Page 8: TP4.pdf

INGENIERÍA EN SISTEMAS DE INFORMACIÓN – 2013

ARQUITECTURA DE COMPUTADORAS

Ing. Juan Carlos Ansaldi

8

SAL Desplazamiento aritmético a la Izq. SAR Desplazamiento aritmético a la derecha

SHL Desplazamiento lógico a la Izq. SHR Desplazamiento lógico a la derecha

SHL/SAL

SAR

SHR

ROL

ROR

RCL

RCR

Ejemplos de desplazamientos lógicos y aritméticos

Números Negativos

0100 MOV DL,B7 0102 MOV CL,04 0104 SHR DL,CL 0106 MOV BL,B7 0108 SAR BL,CL 010A INT 20

Números Positivos 0100 MOV DL,55 0102 MOV CL,04 0104 SHR DL,CL 0106 MOV BL,55 0108 SAR BL,CL 010A INT 20

Ejercicios de desplazamientos y rotaciones

17) ¿Cuál es el resultado de aplicar una rotación con acarreo de 4 bits a la izquierda al número 6Ah,

suponiendo que inicialmente CF= NC (0) en un registro de una longitud de un byte, y al resultado

obtenido le aplicamos un desplazamiento lógico de 2 bits a la derecha?

18) ¿Cuál es el resultado de aplicar una rotación sin acarreo de 4 bits a la izquierda al número B5h,

suponiendo que inicialmente CF= NC (0) en un registro de una longitud de un byte, y al resultado

obtenido le aplicamos un desplazamiento aritmético de 3 bits a la derecha?

19) ¿Cuál es el resultado de aplicar un desplazamiento aritmético a la derecha de 4 bits al número

C7h, suponiendo que inicialmente CF= CY (1) en un registro de una longitud de un byte, y al

resultado obtenido le aplicamos una rotación con acarreo de 4 bits a la derecha?

20) ¿Cuál es el resultado de aplicar un desplazamiento aritmético a la derecha de 2 bits al número

84h, suponiendo que inicialmente CF= CY (1) en un registro de una longitud de un byte, y al

resultado obtenido le aplicamos una rotación con acarreo de 4 bits a la izquierda?

0

0

CF

CF

CF

CF

CF

CF

CF

Page 9: TP4.pdf

INGENIERÍA EN SISTEMAS DE INFORMACIÓN – 2013

ARQUITECTURA DE COMPUTADORAS

Ing. Juan Carlos Ansaldi

9

21) ¿Cuál es el resultado de aplicar un desplazamiento aritmético a la derecha de 2 bits al número

87h, suponiendo que inicialmente CF= CY (1) en un registro de una longitud de un byte, luego se lo

desplaza lógicamente a la derecha 4 bit y por último se rota con acarreo de 5 bits a la izquierda?

22) Comprobar por medio del Debug los resultados obtenidos en los ejercicios anteriores.

23) Partiendo del número A7h se desea obtener el número 1Dh utilizando para ello rotaciones de 4

bits y/o desplazamientos de 2 bits, en un registro de 1 byte de longitud.

Escribir un programa que se pueda comprobar con el Debug que realice dichas operaciones.

24) Idem anterior también partiendo de A7h pero obtener 3Eh con el bit de acarreo CF= CY (1).

Para profundizar:

Fundamentos de los Computadores Pedro de Miguel Anasagasti Sexta Ed. 1998 - Ed.

PARANINFO

Capítulo 5 - Unidad Aritmética

Introducción: Páginas 173- 178 Desplazamientos: Páginas 178-181

Page 10: TP4.pdf

INGENIERÍA EN SISTEMAS DE INFORMACIÓN – 2013

ARQUITECTURA DE COMPUTADORAS

Ing. Juan Carlos Ansaldi

10

Complemento al Trabajo Práctico Nº 4. Leer caracteres

Introducción

Este complemento tiene por finalidad el completar el trabajo que hemos venido realizando hasta

ahora con números hexadecimales, y la realización de este nos permitirá aplicar los conocimientos

que hemos estado adquiriendo y volcarlos en un ejemplo, que además nos servirá para fijar los

mismos.

Ahora que ya sabemos cómo imprimir un byte en formato hexadecimal vamos a invertir el proceso

leyendo dos caracteres -dígitos hexadecimales- del teclado, y convirtiéndolos en un solo byte.

Leer un carácter

La llamada de función INT 21h del DOS que hemos estado usando tiene una función de entrada de

datos, que lee un carácter del teclado. Vimos anteriormente, que el número de función se ha de

poner en el registro AH delante de una llamada INT 21h. Veamos cómo trabaja la función 01h de la

llamada INT 21h.

Introduzcamos INT 21h en la dirección 0100h:

Posteriormente pongamos 01h en el registro AH, y después introduzcamos la orden G 102, o el

comando P, para ejecutar esta instrucción. Parece que no sucede nada, pues todo lo que se ve es el

cursor, aunque en realidad se está esperando a que se pulse una tecla (no lo haga aún). Una vez

pulsada la tecla, el DOS pone el código ASCII de ese carácter en el registro AL. Más tarde vamos a

usar esta instrucción para leer los caracteres de un número hexadecimal, pero ahora veamos qué

sucede cuando se pulsa una tecla.

Leer un número hexadecimal de un solo dígito

Ahora pongamos al revés el programa de conversión con el que convertíamos un número

hexadecimal de un solo dígito en el código ASCII de uno de los caracteres comprendidos entre el 0

y el 9, o entre la A y la F. Para convertir un carácter, tal como la C o la D, de carácter hexadecimal a

byte, necesitamos o bien 30h (de 0 a 9), o 37h (de A a F).

He aquí un sencillo programa que lee un carácter ASCII y lo convierte en un byte:

0100 MOV AH, 01 0102 INT 21 0104 SUB AL, 30

0106 CMP AL, 09 0108 JLE 010C 010A SUB AL, 07

010C INT 20

La mayoría de estas instrucciones ya nos son familiares, pero hay una nueva, JLE (Jump if Less

than or Equal to, saltar si es menor que o igual a).

En nuestro programa, esta instrucción salta si AL es menor que o igual a 9h.

Para ver la conversión de carácter hexadecimal a ASCII es necesario observar el registro AL justo

antes de ejecutar INT 20h. Puesto que Debug restablece los registros cuando ejecuta la instrucción

INT 20h será necesario poner un punto de ruptura, como lo hemos hecho anteriormente. Introduzca

el comando G 10C y verá que AL contiene el número hexadecimal convertido de un carácter.

Pruebe a introducir algunos caracteres, tales como la k o la d, que no son dígitos hexadecimales,

para ver lo que sucede. Comprobará que este programa sólo funciona correctamente cuando la

entrada es uno de los dígitos 0 a 9, o las letras mayúsculas A a F. En el siguiente práctico

corregiremos este pequeño fallo cuando hayamos visto las subrutinas, también llamadas

procedimientos. Hasta entonces ignoraremos las condiciones de error, por lo que "para que el

programa funcione correctamente tendremos que introducir los valores correctos".

Leer un número hexadecimal de dos dígitos

Leer dos dígitos hexadecimales no es mucho más complicado que leer uno solo, pero requiere

muchas más instrucciones. Primero leeremos el primer dígito; después pondremos su valor

Page 11: TP4.pdf

INGENIERÍA EN SISTEMAS DE INFORMACIÓN – 2013

ARQUITECTURA DE COMPUTADORAS

Ing. Juan Carlos Ansaldi

11

hexadecimal en el registro DL y lo multiplicaremos por 16. Para efectuar esta multiplicación

desplazaremos el registro DL cuatro bits a la izquierda, poniendo un 0 hexadecimal (cuatro bits 0) a

la derecha del dígito que acabamos de leer. Poniendo el valor 4 en el registro CL, la instrucción

SHL DL,CL pone ceros a la derecha. De hecho, la instrucción SHL (Shift Left, desplazar a la

izquierda) se conoce como la instrucción de “desplazamiento aritmético”, porque produce el mismo

efecto que una multiplicación aritmética por 2, 4, 8, y así sucesivamente, dependiendo del número

(1, 2, 3, etc.) que haya en el registro CL.

Finalmente, una vez desplazado el primer dígito sumaremos el segundo dígito hexadecimal al

número que está en DL (el primer dígito *16). Podemos verlo en este programa: 0100 MOV AH, 01 0102 INT 21 0104 MOV DL, AL 0106 SUB DL, 30 0109 CMP DL, 09 010C JLE 0111

010E SUB DL, 07 0111 MOV CL, 04 0113 SHL DL, CL 0115 INT 21 0117 SUB AL, 30 0119 CMP AL, 09

011B JLE 011F 011D SUB AL, 07 011F ADD DL, AL 0121 INT 20

Ejercicios del complemento

25) Comprobar las condiciones de los límites para asegurarnos que funciona correctamente.

26) Interpretar el programa anterior, indicando, no solamente lo que hace cada una de las

instrucciones, sino la razón por la cual se han utilizado.

Ejemplo: en la línea 0100, movemos el valor 01 a la parte alta del registro A (AH) pues 01 es la

función de la interrupción 21 que nos permite introducir un carácter por teclado, que será puesto

en el registro AL en formato de código ASCII...

27) Realizar un programa que complemente los correspondientes a leer y escribir caracteres en

hexadecimal. Para esto tengamos en cuenta el siguiente listado que permite

IMPRIMIR NÚMEROS EN HEXADECIMAL 0100 MOV AH,02 0102 MOV DL,BL 0104 MOV CL,04 0106 SHR DL,CL 0108 ADD DL,30 010B CMP DL,3A

010E JL 0113 0110 ADD DL,07 0113 INT 21 0115 MOV DL, BL 0117 AND DL,0F 011A ADD DL,30

011D CMP DL,3A 0120 JL 0125 0122 ADD DL,07 0125 INT 21 0127 INT 20

ANEXO: Instrucciones de Salto Condicional

JA/JNBE etiqueta Salta si es superior ((CF & ZF)=0 después de una operación sin signo )

JAE/JNB etiqueta Salta si es superior o igual (CF=NC=0 después de una operación sin signo )

JB/JC etiqueta Salta si inferior/Salta si acarreo (CF=CY=1)

JE/JZ etiqueta Salta si es igual (ZF=ZR=1)

JG/JNGE etiqueta Salta si es mayor (SF= OF & ZF=0) después de una operación con signo )

JGE/JNL etiqueta Salta si es mayor o igual (SF=OF después de una operación sin signo )

JL/JNGE etiqueta Salta si es menor (ZF OF después de una operación con signo )

JLE/JNG etiqueta Salta si es menor o igual (SF OF ZF=0 después de una operación con signo)

JNC etiqueta Salta si no acarreo (CF=NC=0) (igual JAE/JNB)

JNE/JNZ etiqueta Salta si no es igual (ZF=NZ=0)

JNO etiqueta Salta si no desbordamiento (OF=NO=0)

JNP/JPO etiqueta Salta si no paridad (PF=PO=0: count of 1-bits is ODD)

JNS etiqueta Salta si no signo/si positivo (SF=PL=0: same as high-bit of dest)

JO etiqueta Salta si desbordamiento (OF=OV=1)

JP/JPE etiqueta Salta si paridad (PF=PE=1 count of 1-bits is EVEN)

JS etiqueta Salta si signo (SF=NG=1: same as high-bit of dest)