Date post: | 10-Aug-2015 |
Category: |
Documents |
Upload: | cristian-vanegas |
View: | 243 times |
Download: | 6 times |
Taller Capitulo 3 Lenguaje ensamblador y programación para IBM
PC y compatibles
Cristian Suarez Vanegas- 2420101030
Universidad de Ibagué.
Docente a cargo de la materia:
José Armando Gallego
Ibagué – Tolima
Programa con operaciones sumas, restas, multiplicaciones divisiones e incrementos entre datos
y registros
Primero grabamos las instrucciones
Ahora vamos a ejecutar instrucción por instrucción
Ahora después de seguir ejecución vamos a guardar el programa como un .COM
3.1 Cual es el propósito de cada uno de los siguientes comandos de DEBUG:
a. A [ASSEMBLE]: Ensambla instrucciones que se le introduzcan, guardándolas en la dirección
siguiente a la que se le llego la última instrucción. Cuando se utiliza este comando se le puede dar
como parámetro la dirección donde se desea que se inicie el ensamblado
b. D [DUM]: Muestra el contenido de una zona de memoria en hexadecimal y en ASCII.
c. E [DIRECIION]: Permite editar, byte por byte, una zona de memoria. Muestra -en hexadecimal-
el byte de esa posición y permite escribir otro valor para cambiarlo.
d. P [STEP]: Proceder o ejecutar un conjunto de instrucciones relacionadas
e. Q [QUIT]: Sirve para salir de DEBUG y volver al DOS
f. R [REGISTERS]: Muestra el contenido de los registros de la CPU, así como la próxima instrucción
a ejecutar.
g. T[TRACE]: Ejecuta la instrucción apuntada por cs:ip y vuelve a DEBUG. Permite ejecutar paso a
paso un programa y observar en cada instrucción el efecto producido.
h. U: Desensambla código de máquina y lo pasa a código simbólico
3.2 proporcione los comandos de DEBUG para las siguientes necesidades
a. Muestre la memoria iniciando en el desplazamiento 264H en el segmento de datos
b. Muestre la memoria iniciando en la localidad 410H
C. ingrese el valor hexadecimal A8B364 en el segmento de datos iniciando desde la localidad 200H
Con esto ingresamos los valores hexadecimales A8B364 iniciando desde la localidad 200H
Como podemos ver el valor hexadecimal a8 b3 64 quedo guardado en la localidad 200
D. Muestre el contenido de (i) todos los registros y (ii) solo del registro IP.
E. Desensamble el código de máquina que se encuentra en las localidades desde la 100H hasta
11EH
3.3 proporcione instrucciones en código máquina para las siguientes operaciones:
a. mover el valor hexadecimal 4629 al registro AX
b. sumar el valor hexadecimal 036ª al registro AX
Solución
El código máquina para realizar las anteriores operaciones
Podemos ver que los registros están en cero inicialmente y esta por ejecutarse el comando Mov
AX,4629.
Después de esto al registro AX sele sumara 036A, dando como resultado 4993
3.4 suponga que ha utilizado DEBUG para introducir el comando siguiente
E CS:100 B8 45 01 05 25 00
El valor 45 hexadecimal supuestamente era 54. Codifique otro comando E para corregir solo el
byte que esta incorrecto; esto es cambien el 45 por el 54 en forma directa
Solución
Introducimos el código a DEBUG E CS:100 B8 45 01 05 25 00 y se tiene lo siguiente:
Podemos ver que el registro AL queda con el valor 45 ahora lo vamos a corregir con el valor 54
3.5 suponga que ha utilizado DEBUG para introducir el comando E siguiente:
E CS:100 B8 04 30 05 00 30 90
a. Cuáles son las tres instrucciones simbólicas representadas aquí?
b. Al ejecutarse este programa usted descubre que el registro AX termina con 6004 en lugar
del esperado 0460 ¿Cuales son los dos comandos de DEBUG que se requieren?
c. Habiendo corregido las instrucciones, usted ahora vuelve a ejecutar el programa desde la
primera instrucción ¿Cuáles son los dos comandos de DEBUG que se requieren?
Solución
a. Las 3 instrucciones representadas en el código son:
MOV AX,3004
ADD AX,3000
NOP
b. Esto se debe a que el al guardar los registros en memoria intercambia el byte más
significativo por el menos significativo se esperaba un 0460 y en lugar de esto se obtuvo un
6004 y para corregir esto solo basta con intercambiar las siguientes líneas de código:
E CS:100 B8 30 04 05 30 00 90
c. Los dos comando que se requieren cambiar son los siguientes
MOV AX,0430
ADD AX,0030
Como se puede ver en la captura de pantalla ejecutando nuevamente las instrucciones con
el código corregido ahora si se obtiene en 0460 esperado
3.6 Considere el programa en lenguaje maquina
E CS:100 B0 25 D0 E0 B3 15 F6 E3 90
Este programa realiza lo siguiente:
Mueve el valor 25 hexadecimal al registro AL.
Recorre el valor 25 hexadecimal al registro AL.
Mueve el valor 15 hexadecimal al registro BL.
Multiplica AL por BL.
Y se puede ver que el resultado final en el registro AX es 0612
3.7 Utilice el comando E de DEBUG para introducir el siguiente programa en lenguaje de maquina:
Código de maquina (en 100H) A0 00 02 D0 E0 F6 26 D1 02 A3 02 02 90
Datos (en 200H) 25 15 00 00
Este programa realiza lo siguiente:
Mueve el contenido de un byte en DS:0200 (25) al registro AL.
Recorre el contenido de AL un bit a la izquierda. (El resultado es 4A)
Multiplica el AL por un byte contenido en DS:0201 (15)
Mueve el producto de AX a la palabra que inicia en DS:0202
Como se puede ver en a captura de pantalla el resultado final en AX es 0612 ahora para
comprobar vamos a ver la posición de memoria D DS:0200 y veremos el producto almacenado en
DS:0202 como 1206
3.8 Para la pregunta 3.7codifique comandos que graben el programa con el nombre TRIAL.COM
Para guardar primero el programa en este caso lo ingresamos con E y una vez ingresamos todo el
programa le damos N nombredearchivo.COM
Después de esto utilicé R BX e ingrese 0 para limpiarlo, después use R CX para mostrar el registro
CX y aquí ingresamos el tamaño del programa la razón de porque se borra el BX es porque la
longitud del programa está en la pareja BX:CX, y por ultimo escribimos W para guardar el archivo
Y podemos verificar que efectivamente el programa quedo guardado
3.9 Utilice el comando A de DEBUG para introducir las siguientes instrucciones:
Ahora desensamble y rastree su ejecución hasta NOP y revise el valor en el BX después de cada
instrucción.
Después de revisar el valor de BX instrucción a instrucción se puede ver que el valor final de BX es
88H
3.10 Cual es el propósito de la instrucción INT?
Generar una interrupción de software. Se necesita el número de interrupción formato de byte de
valor
Cuando está escrito en lenguaje ensamblador, la instrucción se escribe así:
INT X
Donde X es la interrupción de software que debe ser generada (0-255).
Cuando se genera una interrupción de software, el procesador llama a uno de los 256 funciones
señaladas por la tabla de direcciones de interrupción, que se encuentra en los primeros 1024 bytes
de memoria, Por tanto, es totalmente posible utilizar una instrucción de gran llamada para iniciar
la interrupción función manualmente después de empujar el registro de bandera.
Una de las interrupciones de software más útiles DOS era 0x21 interrupción. Al llamarlo con
diferentes parámetros en los registros (en su mayoría ah y otros) se puede acceder a varias
operaciones de entrada y salida, salida de cadena, etc.