Vous êtes sur la page 1sur 30

Asignatura: Sistemas Digitales Programables

Laboratorio 1: Introduccin al software EMU8086

Alumnos:

CARNET APELLIDOS NOMBRES


Asignatura: Sistemas Digitales Programables

Laboratorio 1: Introduccin al software EMU8086

Alumnos:

CARNET APELLIDOS NOMBRES

Porcentaje (%) Nota

Introduccin 5

Objetivos 5

Marco Terico 10

Desarrollo de la practica 10

Asignaciones 40

Asignacin 1 6.67

Asignacin 2 6.67

Asignacin 3 6.67

Asignacin 4 6.67

Asignacin 5 6.67

Asignacin 6 6.67

Conclusiones 30

NOTA FINAL
INDICE

INTRODUCCION....................................................................................................................4

OBJETIVOS ............................................................................................................................... 4

MARCO TEORICO ................................................................................................................. 5

DESARROLLO DE LA PRACTICA..................................................................................... 7

ASIGNACION 1 ....................................................................................................................... 9

ASIGNACION 2 .....................................................................................................................11

ASIGNACION 3 .................................................................................................................... 15

ASIGNACION 4 ................................................................................................................... 20

ASIGNACION 5 ..................................................................................................... 24

ASIGNACION 6 ................................................................................................................... 26

CONCLUSIONES ................................................................................................................. 30
INTRODUCCION

En el presente trabajo presentamos al microprocesador como un dispositivo


programable. Conociendo el uso y manejo del Software EMU8086. Ya que es fcil
de utilizar, su interfaz de simulacin al ser interactiva y realizar pasa a paso cada
instruccin permite identificar fcilmente errores en el cdigo.

Se muestra un ejemplo explicado paso a paso para mayor comprensin del


microprocesador haciendo nfasis en los registros internos de este. Tomando
ese ejemplo se realizarn las asignaciones mostrando con ayuda de capturas el
resultado que se da al compilarlo.

Al final del trabajo como asignacin se da una breve descripcin de algunas


instrucciones, y con ayuda del ejemplo expuesto en esta seccin se pretende
conocer su uso y sus limitaciones.

OBJETIVOS

Objetivo General:

Conocer el funcionamiento y adaptarse al software EMU8086.

Objetivos Especficos:

Instruirse en el uso bsico del software para la simulacin de programas


aptos para el aprendizaje.
Facilitar la adaptacin al simulador por medio del tutorial de inicio que
posee.

4
MARCO TEORICO

El Intel 8086 y el Intel 8088 son los primeros microprocesadores de 16 bits


diseados por Intel. Son los primeros miembros de la arquitectura x86. Fue
lanzado al mercado en 1978 y el 8088 en 1979.

El 8086 y 8088 ejecutan el mismo nmero de instrucciones. Comparndolos


internamente son idnticos a excepcin del 8086 que posee una cola de 6 bytes
para instrucciones y el 8088 solo posee 4. Exteriormente la diferencia es que el
8086 tiene un bus de 16 bits y el 8088 su bus es de 8 bits, por lo tanto, el 8086 es
ms rpido, aunque el 8088 permite la fabricacin de sistemas ms econmicos.

En la primera computadora personal de IBM fue utilizado el microprocesador


8088, la IBM PC.

ESTRUCTURA INTERNA

Unidad de interfaz del bus y unidad


de ejecucin.

El 80886 y el 8088 tienen


internamente dos componentes, la
Unidad de Interfaz del Bus (BIU) y la
Unidad de ejecucin (EU). La
Unidad de ejecucin procesa las
instrucciones del CPU, mientras que
la Unidad de Interfaz del Bus
maneja la lectura y escritura desde
y hacia la memoria y los puertos de
entrada/salida.

Figura 1. Diagrama en bloque del 8086.

5
La ventaja de esta divisin fue el ahorro de esfuerzo necesario para producir el
8088. Slo una mitad del 8086 (el BIU) tuvo que redisearse para producir el 8088.

Registros de uso general del 8086/8088:

Tienen 16 bits cada uno y son ocho:

AX = Registro acumulador, dividido en AH y AL (8 bits cada uno). Usndolo se


produce (en general) una instruccin que ocupa un byte menos que si se
utilizaran otros registros de uso general. Su parte ms baja, AL, tambin tiene esta
propiedad. El ltimo registro mencionado es el equivalente al acumulador de los
procesadores anteriores (8080 y 8085). Adems, hay instrucciones como DAA;
DAS; AAA; AAS; AAM; AAD; LAHF; SAHF; CBW; IN y OUT que trabajan con AX o
con uno de sus dos bytes (AH o AL). Tambin se utiliza este registro (junto con
DX a veces) en multiplicaciones y divisiones.

BX = Registro base, dividido en BH y BL. Es el registro base de propsito similar


(se usa para direccionamiento indirecto) y es una versin ms potente del par de
registros HL de los procesadores anteriores.

CX = Registro contador, dividido en CH y CL. Se utiliza como contador en bucles


(instruccin LOOP), en operaciones con cadenas (usando el prefijo REP) y en
desplazamientos y rotaciones (usando el registro CL en los dos ltimos casos).

DX = Registro de datos, dividido en DH y DL. Se utiliza junto con el registro AX


en multiplicaciones y divisiones, en la instruccin CWD y en IN y OUT para
direccionamiento indirecto de puertos (el registro DX indica el nmero de puerto
de entrada/salida).

SP = Puntero de pila (no se puede subdividir). Aunque es un registro de uso


general, debe utilizarse slo como puntero de pila, la cual sirve para almacenar
las direcciones de retorno de subrutinas y los datos temporarios (mediante las
instrucciones PUSH y POP). Al introducir (push) un valor en la pila a este registro

6
se le resta dos, mientras que al extraer (pop) un valor de la pila este a registro se
le suma dos.

BP = Puntero base (no se puede subdividir). Generalmente se utiliza para realizar


direccionamiento indirecto dentro de la pila.

SI = Puntero ndice (no se puede subdividir). Sirve como puntero fuente para las
operaciones con cadenas. Tambin sirve para realizar direccionamiento indirecto.

DI = Puntero destino (no se puede subdividir). Sirve como puntero destino para
las operaciones con cadenas. Tambin sirve para realizar direccionamiento
indirecto.

DESARROLLO DE LA PRACTICA

Como primera prctica se ejecut un programa de ejemplo que est incluido en


la carpeta de instalacin del simulador. El ejemplo, HELLO WORLD, se compilo
y se simulo en la prctica de laboratorio. La funcin SINGLE STEP permiti
observar el comportamiento del ejemplo paso a paso. Luego se observaron ms
ejemplos que presenta el simulador. Por ejemplo, el programa de suma y resta.

A continuacin, se realiza ltimo literal de la prctica, el cual dice: disear el


programa para sumar dos nmeros que se encuentran a partir de la direccin
1000H dejando el resultado en 1002H.

org 1000h

mov [1000h],3

mov [1001h],6

add al,[1000h]

add al,[1001h]

mov [1002h],al

ret

7
Imagen:

Figura 2. Comportamiento del programa desarrollado en la prctica del laboratorio, se


observa el resultado en el registro al.

Descripcin del cdigo

Se inicia con direccionar el inicio del programa a 1000h, luego se ingresan los
valores a sumar en las direcciones 1000h y 1001h. Realiza la suma en el registro
al y finalmente lo direcciona a 1002h.

8
ASIGNACIONES

1. Ejecute en el EMU8086 el programa que se encuentra en el anexo, y explique


cada uno de los pasos que lo conforman, colocando cada una de las ventanas
que se alteran en el EMU8086.

Cdigo:

1. name "Anexo - Hello World"


2.
3. ; El siguiente ejemplo imprime "HELLO WORLD!"
4. ; escribiendo directamente en la memoria de video.
5.
6. #make_BIN#
7.
8. ; crea registro de segmento:
9.
10. MOV AX, 0B800h ; 0B800h es la direccion de
11. ; la tarjeta VGA para texto
12. MOV DS, AX ; luego lo envia a DS para
13. ; reterner ahi la direccion
14.
15. ; imprime "HELLO" usando DS como segmento:
16.
17. MOV [52h], 'H'
18. MOV [54h], 'E'
19. MOV [56h], 'L'
20. MOV [58h], 'L'
21. MOV [5Ah], 'O'
22.
23. ; imprime "WORD!" usando ES como segmento (mejor ya que
24. ; no se pierde el acceso a las variables declaradas en
25. ; el segmento de codigo).
26.
27. ; registro de segmento:
28.
29. PUSH CS
30. POP DS ; DS = CS.
31. MOV AX, 0B800h
32. MOV ES, AX
33. MOV ES:[5Eh], 'W'
34. MOV ES:[60h], 'O'
35. MOV ES:[62h], 'R'
36. MOV ES:[64h], 'L'
37. MOV ES:[66h], 'D'
38. MOV ES:[68h], '!'
39. HLT

9
Imgenes:

Figura 3 . Captura de pantalla del momento donde inicia el programa.

Figura 4. Captura de pantalla del programa en su finalizacin, el emulador ya ha sido


detenido y el mensaje desplegado en la consola. Durante la emulacin se observa el
proceso en las ventanas emergentes.

Descripcin del cdigo: este presenta un ejemplo de cmo escribir directamente


en la tarjeta de video, omitiendo el uso de interrupciones; como imprimir con el
uso de dos segmentos diferentes, DS y ES. Siendo una ventaja el uso de ES ya que
no se pierde el acceso a las variables declaradas en el cdigo de segmento.

10
2. Disee un programa el cual solicite el ingreso de 10 caracteres (5 nmeros de
un digito y 5 letras, las cuales deben de ser vocales), los nmeros deben ser
almacenados en la tabla NUMS y las vocales en la tabla VCLS, y luego se deben
de mostrarse en pantalla los elementos de la tabla NUMS y de la tabla VCLS, en
el orden que fueron ingresado.

Cdigo:

1. numeros: mov dx, offset msg1


2. mov ah, 9
3. int 21h ;Lee el caracter que se
ingresa en al:
4. mov ah, 1
5. int 21h
6.
7. cmp al, 030h ;Se validan los datos ingresados
8. jb stop
9.
10. cmp al, '9'
11. ja stop

12. numero: mov dx, offset valido ;Mostrara en pantallada un


mensaje de validacion
13. mov NUMS[si], al ;Guarda el dato
14. inc si ;Se usa para no sobreponer
los datos en NUMS
15. inc cont ;
16. cmp cont, 5 ;Contador que se encarga de
ingresar solo 5 datos
17. je salto ;
18. jmp print ;Interrupcion
19.
20. stop: mov dx, offset paro ;Mostrara en pantalla que el
dato no es valido
21.
22. print: mov ah, 9 ;
23. int 21h ;Interrupcion
24.
25. jmp numeros
26.
27. salto: mov si, 0 ;
28. mov dx, offset nl ;
29. mov ah, 9 ; Salto de linea
30. int 21h ;
31. jmp vocales ;
32.
33. vocales: ;Inicia el ingreso de vocales
34. mov dx, offset mssg2
35. mov ah, 9
36. int 21h
37.
38. mov ah, 1 ; Lee el dato ingresado

11
39. int 21h
40.
41. cmp al,'a' ;Se validan los datos
ingresados
42. je ok
43.

44. cmp al,'e'


45. je ok
46.
47. cmp al,'i'
48. je ok
49.
50. cmp al,'o'
51. je ok
52.
53. cmp al,'u'
54. je ok
55.
56. cmp al,'A'
57. je ok
58.
59. cmp al,'E'
60. je ok
61.
62. cmp al,'I'
63. je ok
64.
65. cmp al,'O'
66. je ok
67.
68. cmp al,'U'
69. je ok
70.
71. jmp stopv
72.
73. ok: mov dx, offset valida ; Mostrara en pantalla un
mensaje de validacion
74. mov VOC[si], al ; Guarda en VOC
75. inc si ; Se da un incremento en SI
para que no se sobrepongan los datos
76. inc cont2
77. cmp cont2, 5 ; Es la condicion que indicara
al programa cuando parar
78. je salir
79. jmp printv
80.
81. stopv: mov dx, offset detenerse ;Muestra que el caracter
no es valido
82.
83. printv:
84. mov ah, 9 ;interrupcion
85. int 21h
86.
87. jmp vocale
88. ;Llamado de
tablas y
89. msg1 db "Ingrese SOLO numeros: $" ;se declaran
los mensajes
90.
91. valido db " VALIDO" , 0Dh,0Ah, "$"

12
92.
93. paro db " SOLO numeros" , 0Dh, 0Ah, "$"
94.
95. tabla db 10,13,10, 13," NUMS : " , "$"
96.
97. nums db 5 dup (?)
98.
99. cont db 0
100.
101. mssg2 db "Ingrese SOLO vocales: $"
102.
103. valida db " VALIDA", 0Dh, 0Ah, "$"
104.
105. detenerse db " SOLO vocales", 0Dh, 0Ah, "$"
106.
107. cont2 db 0
108.
109. VOC db 5 dup (?)
110.
111. 5vocales db "FIN", 0Dh, 0Ah, "$"
112.
113. tabla2 db 10, 13, 10, 13, " VOC : ", "$"
114.
115. nl db 10,13, " " ,0Dh, 0Ah, "$"
116.
117.
118. mov cx, 5
119.
120. salir: mov dl, offset tabla ; Muestra las tablas
en pantalla
121. mov ah, 9
122. int 21h
123. mov dl, nums
124. mov ah, 02h
125. int 21h
126. mov dl, nums+1
127. mov ah, 02h
128. int 21h
129. mov dl, nums+2
130. mov ah, 02h
131. int 21h
132. mov dl, nums+3
133. mov ah, 02h
134. int 21h
135. mov dl, nums+4
136. mov ah, 02h
137. int 21h
138. mov dx, offset tabla2
139. mov ah, 9
140. int 21h
141. mov dl, VOC
142. mov ah, 02h
143. int 21h
144. mov dl, VOC+1
145. mov ah, 02h
146. int 21h
147. mov dl, VOC+2
148. mov ah, 02h
149. int 21h
150. mov dl, VOC+3
151. mov ah, 02h

13
152. int 21h
153. mov dl, VOC+4
154. mov ah, 02h
155. int 21h

Imgenes:

Figura 5. Simulacin del programa de forma correcta, cumpliendo con todos los
parmetros del enunciado.

Figura 6. Se muestra que el programa tiene un proceso de corroboracion de datos,


identificando cuando el carcter no es el que el programa pide.

Descripcin del cdigo: el cdigo solicita al usuario cinco nmeros y cinco


vocales, este cdigo ha sido diseado para que se ingresen primero los nmeros
y despus las vocales. Cuando termina de ingresar los caracteres estos se
almacenan en una tabla, NUMS y VOC, respectivamente. Se muestra claramente
el mensaje de no validacin cuando el usuario ingresa un carcter incorrecto.

14
3. Disear un programa que almacene 4 nmeros, 2 en la tabla NUMS1 y 2 en
otra tabla NUMS2. Posteriormente realizar la suma, resta, multiplicacin y
divisin. Entre los elementos de las tablas y los resultados deben de ser
almacenados en la tabla RESUL de la siguiente manera.

Cdigo:

1. org 100h
2.
3. mov ax,0600h ;06 recorre la pantalla, 00 pantalla completa
4. mov bx,0f000h ;fondo blanco, letra negra
5. mov cx,0000h ;esquina superior izquierda reglon, columna
6. mov dx,184Fh ;esquina inferior derecha reglon, columna
7. int 10h ;llama al BIOS
8.
9. ;configurar cursor
10. mov ah,02h ;peticion para fijar cursor
11. mov bh,00 ;numero de pagina
12. mov dh,00 ;fila
13. mov dl,00 ;columna
14. int 10h ;llama al BIOS
15.
16. mov si,0 ;apunta a la primera direccion del tabla
NUMS_1
17. mov di,0 ;apunta a la primera direccion del tabla
NUMS_2
18. mov bx,0 ;da un valor a bx
19.
20. cptrdenums:
21. cmp si, 4 ;al ingresar 4 numeros se sale de este
bucle
22. je ops
23. mov ah,09h ;peticion para desplegar
24. lea dx,msg1 ;cargar la dirrecion de la indicacion
25. int 21h ;llama al DOS
26.
27. ;codigo para leer numero con eco
28. mov ah,01h ;peticion de leer numero, se guarda en al
29. int 21h ;llama al DOS
30.
31. cmp al,29h ;

15
32. jb ERROR ;
33. cmp al,30h ;Comprueba que el valor sea un digito
34. je ECERO ;
35. cmp al,39h ;
36. ja ERROR ;
37.
38. cmp si,1
39. ja tablaNUMS_2
40.
41. sub al,30h ;introduce el valor no el hexa del ascii
42. mov NUMS_1[si],al ;introduce el num en la tabla NUMS_1
43. inc si
44. loop cptrdenums
45.
46. tablaNUMS_2:
47. sub al,30h ;introduce el valor no el hexa del ascii
48. mov NUMS_2[di],al ;introduce el num en la tabla NUMS_2
49. inc si
50. inc di
51. loop cptrdenums
52. ;__________________________________________________________
53. ops:
54. mov cx,2 ;inicializa datos antes de las
operaciones
55. mov si,0
56. mov di,0
57. suma:
58. mov al, NUMS_1[si] ;adquiere los operandos de las tablas
59. mov bl, NUMS_2[si]
60. add bl,al
61. mov RESUL[di],bl ;guarda el resultado en la tabla
62. add di,4 ;salto de posicion en la tabla
63. inc si
64. loop suma
65.
66. mov cx,2
67. mov si,0 ;inicializa datos antes de las
operaciones
68. mov di,1
69. resta:
70. mov al, NUMS_1[si] ;adquiere los operandos de las tablas
71. mov bl, NUMS_2[si]
72. sub al, bl
73. mov RESUL[di],al ;guarda el resultado en la tabla
74. add di,4 ;salto de posicion en la tabla
75. inc si
76. loop resta
77.
78. mov cx,2
79. mov si,0 ;inicializa datos antes de las
operaciones
80. mov di,2
81. multiplicacion:
82. mov al, NUMS_1[si] ;adquiere los operandos de las tablas
83. mov bl, NUMS_2[si]
84. mul bl
85. mov RESUL[di],al ;guarda el resultado en la tabla
86. add di,4 ;salto de posicion en la tabla
87. inc si
88. loop multiplicacion
89.

16
90. mov cx,2
91. mov si,0 ;inicializa datos antes de las
operaciones
92. mov di,3
93. division:
94. mov al, NUMS_1[si] ;adquiere los operandos de las tablas
95. mov bl, NUMS_2[si]
96. mov ah,00h
97. div bl
98. mov RESUL[di],al ;guarda el resultado en la tabla
99. inc si ;salto de posicion en la tabla
100. add di,4
101. loop division
102.
103. ;Imprime resultados
104. mov cx,8
105. mov si,0
106. printRESUL:
107.
108. mov ah,09h
109. lea dx,msg2
110. int 21h
111.
112. mov ah,00h
113. mov al,RESUL[si] ;saca el resultado de su tabla
114. cmp al,81 ;corrobora que no sea negativo
115. ja negative
116. aam ;corrige resultado
117. mov bx,ax
118. add bl,30h ;corrige el valor del numero
119. add bh,30h
120. mov ah, 02h
121. mov dl,bh ;imprime
122. int 21h
123. mov ah, 02h
124. mov DL,BL ;imprime
125. int 21H
126. inc si
127. loop printRESUL
128. jmp salida ;manda a terminar el programa
129.
130. negative:
131. not ax
132. add ax,01h
133. aam
134. add ax,3030h ;corrige el valor
135. mov bx,ax
136. mov ah,09h
137. lea dx,msgneg ;imprime el simbolo negativo
138. int 21h
139. mov ah,02h
140. mov dl,bh ;imprime
141. int 21h
142. mov ah,2h
143. mov dl,bl ;imprime
144. int 21h
145. inc si
146. loop printRESUL
147. jmp salida ;manda a terminar el programa
148. ;_________________________________________________________
149. ECERO:

17
150. mov ah,09h ;Mensaje de advertencia,
151. lea dx,msgCERO ;ya que no hay division entre cero
152. int 21h
153. jmp cptrdenums
154. ;_________________________________________________________
155. ERROR:
156. mov ah,09h ;Mensaje de advertencia,
157. lea dx,msgERROR ;el dato ingresado no es un numero
158. int 21h
159. jmp cptrdenums
160. ;_________________________________________________________
161. salida:
162. hlt
163.
164. ;Variables
165. msg1 db 10,13,"Ingrese un numero:","$"
166. msg2 db 10,13,"El resultado es:","$"
167. msgneg db 10,13,"-","$"
168. msgERROR db 10,13,"ERROR, POR FAVOR INGRESAR UN NUMERO","$"
169. msgCERO db 10,13,"ERROR, POR FAVOR INGRESAR UN NUMERO
DISTINTO DE CERO","$"
170. NUMS_1 db 2 dup(?)
171. NUMS_2 db 2 dup(?)
172. RESUL db 8 dup(?)

Imgenes:

Figura 7. Comportamiento del programa, se observa que el programa es capaz de realizar


operaciones aritmticas con resultados de dos dgitos.

18
Figura 8. Comportamiento del programa, se observa que el programa es capaz de realizar
operaciones aritmticas con resultados negativos.

Descripcin del cdigo: el programa inicia con la configuracin de pantalla y


cursor. El desarrollo del programa se divide en diferentes labels especficas y
necesarias para lograr los resultados. El primer label es tiene la finalidad de
capturar los datos ingresados, comprobar que sean correctos y guardarlos en sus
tablas especificadas en el enunciado de la asignacin. Luego se utiliza una label
por cada operacin aritmtica, en ellas se obtiene los datos de las tablas de
nmeros de entrada y se guardan en una sola tabla de resultados con un orden
especfico. Finalmente, se realiza la impresin de la tabla de resultados.

19
4. Disee un programa que almacene 5 nmeros en una tabla llamada NUMS,
que los compare, y muestre en pantalla cual es el promedio, y cul es el nmero
menor.

Cdigo:

1. org 100h
2.
3. mov ax,0600h ;06 recorre la pantalla, 00 pantalla completa
4. mov bx,0f000h ;fondo blanco, letra negra
5. mov cx,0000h ;esquina superior izquierda reglon, columna
6. mov dx,184Fh ;esquina inferior derecha reglon, columna
7. int 10h ; llama al BIOS
8.
9. ;configura el cursor
10. mov ah,02h ;peticion para fijar cursor
11. mov bh,00 ;numero de pagina
12. mov dh,00 ;fila
13. mov dl,00 ;columna
14. int 10h ;llama al BIOS
15.
16. mov si,0 ;apunta a la primera direccion de la tabla
17. mov cx,5 ;contador de # de datos obtenidos
18. cptrdenums:
19.
20. mov ah,09h ;peticion para desplegar
21. lea dx,msg1 ;cargar la dirrecion de la indicacion
22. int 21h ;llama al DOS
23.
24. ;codigo para leer numero con eco
25. mov ah,01h ;peticion de leer numero, se guarda en al
26. int 21h ;llama al DOS
27.
28. cmp al,29h ;
29. jb ERROR ;
30. cmp al,30h ;Comprueba que el valor sea un
digito
31. cmp al,39h ;
32. ja ERROR ;
33.
34. mov ah,0h
35. sub al,30h ;introduce el valor no el hexa del ascii
36. mov NUMS[si],al ;introduce el num en la tabla NUMS_1
37. inc si
38. loop cptrdenums
39. mov ah,09h
40. lea dx,msg2
41. int 21h
42.
43. mov si,0
44. mov di,0
45. mov ah,0
46.
47. mov al, NUMS[di]
48. comparador:
49. inc si ;cuando ya se haya comparado los 5 #s
50. cmp si,5h ;

20
51. je print ; se va a imprimir
52. mov bl, NUMS[si] ;
53. cmp al,bl ;compara el primer dato con el resto
54. jb menor
55. ja mayor
56. loop comparador
57.
58. menor: ;si el dato es el menor, se guarda
59. mov MEN[0],al ;y se sigue comparando el mismo #
60. jmp comparador
61.
62. mayor: ;si el dato es el mayor, se intercambian
63. mov bl,NUMS[di] ;para luego regresar y capturar siempre
64. mov al, NUMS[si] ;el menor
65. jmp comparador
66.
67. ;Imprime resultados
68.
69. print:
70.
71. mov bh,0h ;para evitar errores
72. mov bl,al
73. add bl,30h ;se corrige el valor
74. mov ah,06h
75. mov dl,bl ;se imprime
76. int 21h
77.
78. mov ah,09h
79. lea dx,msgprom ;imprime enunciado msgprom
80. int 21h
81.
82. mov cx,4
83. mov si,0
84. mov bx,0
85. mov bl,NUMS[si]
86. sum:
87. inc si
88. add bl,NUMS[si] ;sumatoria de los #s en bl
89. loop sum
90.
91. mov ah,0h ;para evitar errores
92. printprom:
93.
94. mov al,bl ;manda la sumatoria a al
95. mov bl,5
96. div bl ;obtiene el promedio
97. mov bl,al
98. add bl,30h ;corrige el dato
99. mov ah,06h
100. mov dl,bl ;imprime
101. int 21h
102. jmp salida
103.
104. ERROR:
105. mov ah,09h ;Mensaje de advertencia,
106. lea dx,msgERROR ;el dato ingresado no es un numero
107. int 21h
108. jmp cptrdenums
109. ;_________________________________________________________
110. salida:
111. hlt

21
112.
113. ;Variables
114. msg1 db 10,13,"Ingrese un numero:","$"
115. msg2 db 10,13,"El menor es:","$"
116.
117. msgneg db 10,13,"-","$"
118. msgERROR db 10,13,"ERROR, POR FAVOR INGRESAR UN NUMERO","$"
119. msgprom db 10,13,"El promedio es: ","$"
120. NUMS db 5 dup(?)
121. MEN db 1 dup (?)

Imgenes:

Figura 9. Muestra de cmo funciona el programa, la sumatoria de los datos ingresados


es 20, con lo cual se comprueba que funciona correctamente.

22
Figura 10. Aqu se observa que cuando la suma no da un mltiplo de 5, en este caso 17,
el programa aproxima al entero inmediato anterior.

Descripcin del cdigo: el programa inicia con la configuracin de pantalla y


cursor. El desarrollo del programa se enfoca en validar los datos, guardarlos,
encontrar el dato menor para mostrarlo y encontrar el promedio de todos los
datos ingresados para imprimirlos posteriormente.

23
5. Defina el registro de banderas y explique la funcin de cada bit que lo
conforma.

Las banderas proveen una manera de obtener informacin acerca de del estado
actual de la mquina y el resultado de procesamiento de una instruccin. El
registro de banderas es un registro de 16 bits, pero no todos los bits se usan.

Tabla 1 - Banderas ms comunes

Bandera Bit Nombre

CF 0 Bandera de acarreo (carry flag)

PF 2 Bandera de paridad (parity flag)

AF 4 Bandera de acarreo auxiliar (adjust flag)

ZF 6 Bandera de cero (zero flag)

SF 7 Bandera de signo (sign flag)

DF 10 Bandera de direccin (direction flag)

OF 11 Bandera de desbordamiento (overflow flag)

Estas banderas sern alteradas por los resultados producidos en la ejecucin de


instrucciones aritmticas y lgicas.

Bandera de acarreo: CF (Carry Flag): este bit ser alterado en su valor (1 o 0) por
la ejecucin de instrucciones aritmticas. Para la suma y resta, cuando el resultado
exceda el tamao de los operandos manejados y el microprocesador no pueda
entregarlo en sus registros de tamao fijo, sta bandera detectar dicho bit y lo
almacenar hasta que se realice otra operacin de suma o resta. Para la suma se
le llama acarreo final y para la resta se le llama prstamo

24
Bandera de paridad PF (PARITY FLAG): este bit ser alterado en su valor por la
ejecucin de instrucciones aritmticas o lgicas. La paridad es detectada en el
byte menos significativo en el resultado de la operacin y checar cuantos unos
lgicos (1) existen. Si la cantidad de unos en impar (1,3,5,7), se detectar una
paridad IMPAR (ODD). Si la cantidad de unos es par (0,2,4,6,8), se detectar una
paridad PAR (EVEN).

Bandera de acarreo auxiliar AF (AUXILIARY CARRY FLAG): este bit ser alterado
en su valor por la ejecucin de instrucciones aritmticas. El acarreo auxiliar ser
detectado por el que se produce de las unidades a las decenas (o del bit 3 al bit
4), y no en el resultado. Esta bandera es utilizada principalmente en instrucciones
que convierten resultados de hexadecimal a decimal (BCD).

Bandera de cero ZF (ZERO FLAG): este bit ser alterado en su valor por la
ejecucin de instrucciones aritmticas y/o lgicas. La bandera de CERO ser
detectada cuando el resultado que se produce en la operacin sea cero (igual a
0) o diferente de cero (no 0).

Bandera de signo SF (SIGN FLAG): este bit ser alterado en su valor por la
ejecucin de instrucciones aritmticas y/o lgicas. El signo ser detectado cuando
el resultado que se produce en la operacin sea positivo o negativo. Este se
identifica en el bit ms significativo del resultado.

Bandera de sobreflujo OF (OVERFLOW FLAG): este bit ser alterado en su valor


por la ejecucin de instrucciones aritmticas. El sobre flujo ser detectado cuando
el resultado que se produce en la operacin cambia de signo, contrario a los
signos de los operandos manejados, ste se detecta en el bit ms significativo. Si
son positivos los operandos y cambia el resultado a negativo, o si son negativos
los operandos y cambia el resultado a positivo.

25
6. Investigar el uso de las siguientes instrucciones y realizar un pequeo ejemplo
con cada una de ellas.

INSTRUCCIN USO EJEMPLO

MOV AL, 5
Intercambia destino con origen; no se puede usar con
MOV AH, 2
registros de segmento. Esta instruccin encuentra su
XCHG AL, AH ; AL
XCHG utilidad en aquellas instrucciones que tienen asociados = 2, AH = 5

registros especficos. XCHG AL, AH ; AL


= 5, AH = 2

RET

AH = flags register
Transfiere al registro AH el contenido de las banderas.
AH bit:

Se utiliza para verificar el estado de las banderas 7 6 5 4


LAHF 3 2 1 0
durante la ejecucin de un programa.
[SF] [ZF] [0]
[AF] [0] [PF] [1] [CF]

bits 1, 3, 5 are
reserved.

flags register = AH

SAHF AH bit:
Almacena en los ocho bits menos significativos del
7 6 5 4 3
registro de indicadores el valor del registro AH. 2 1 0

[SF] [ZF] [0] [AF]


[0] [PF] [1] [CF]

bits 1, 3, 5 are
reserved.

26
MOV BX, OFFSET
TABLA
La instruccin XLAT tabla carga en el registro AL el contenido
de la posicin [BX][AL], en donde el registro BX ha de apuntar MOV AL, 4

al comienzo de una tabla. Dicho de otra manera, AL hace de XLAT TABLA

ndice de la tabla y de almacn destino del contenido de la


XLAT tabla.

MOVZX (Mover con extensin de ceros) copia el contenido de un

operando de origen aun operando de destino, y extiende con

ceros el valor hasta 16 o 32 bits. Se utiliza con enteros sin


signo. Variantes

BSWAP Toma el contenido de cualquier registro de 32 bits e

intercambia el primer byte con el cuarto, y el segundo con el


tercero. Se utiliza para convertir datos entre los formatos

Little Endian y Big Endian.

El operando de origen se escribe en el operando destino. Si


XOR EBX,EBX
el operando fuente es un operando de memoria, a
CMOV ADD
continuacin, independientemente de la condicin, el ECX,[SMALL_COUNT]

operando de la memoria se lee. Esto indica que si se lee la JNC Continue

memoria operacin generara un fallo (#GP o #PG), a MOV ECX,EBX

continuacin, a pesar de que la condicin puede ser falsa, el


fallo se produce. Los operandos de fuente y de destino son
siempre 16 o 32 bits. No hay provisiones para una versin de
8 bits de esta instruccin.

27
Se desplazan a la izquierda los bits del operando destino
tantas posiciones como indique el operando fuente. El
MOV AX, 5A30H
desplazamiento de una posicin se realiza de la siguiente
SHL AX, 8
forma: el bit de mayor peso del operando se desplaza al bit

CF del registro de estado, el resto de los bits se desplazan

SHL una posicin hacia la izquierda, y la posicin de menor peso


se rellena con un 0.

SHR La instruccin SHR funciona de la misma forma que SHL, pero


MOV AL, 00000111b
desplazando los bits a la derecha en lugar de a la izquierda
SHR AL, 1 ; AL =
00000011b, CF=1.

RET

Rotar a la izquierda con acarreo. Rota a la izquierda los bits


STC ; set carry
del junto con la bandera de acarreo, CF: el nmero de bits (CF=1).
RCL
especificados en el segundo operando. MOV AL, 1Ch ; AL =
00011100b

RCL AL, 1 ; AL =
00111001b, CF=0.

RET

MOV AL, 1Ch ; AL =


ROL Rotar a la izquierda. Rota a la izquierda los bits del operando 00011100b

de tal forma que el bits del extremo izquierdo del operando ROL AL, 1 ; AL =
00111000b, CF=0.
destino hacia el bit del extremo derecho de dicho operando
RET
y al mismo tiempo para el bit de acarreo CF.

28
RCR Rotar a la derecha con acarreo. Rota a la derecha los bits del operando
STC ; set
junto con la bandera de acarreo, CF, el nmero de bits especificado carry (CF=1).

en el segundo operando. MOV AL, 1Ch ; AL


= 00011100b

RCR AL, 1 ; AL
= 10001110b, CF=0.

RET

Rotar a la derecha. Rota a la derecha los bits del operando de tal forma
MOV AL, 1Ch ;
que el bit del extremo derecho del operando destino para el bit AL = 00011100b

extremo izquierdo de dicho operando y al mismo tiempo para el bit ROR AL, 1 ;
AL = 00001110b,
de acarreo CF. CF=0.

RET
ROR

29
CONCLUSIONES

El emulador 8086 permite la oportunidad de simular programas capaces


de ser ejecutados por el microprocesador 8086 diseado por Intel. El
software posee una interfaz grfica que permite observar los registros, la
pila de memoria, entre otros. Esto es una ayuda en el caso de tener errores
en la ejecucin del programa, ya que se puede observar el
comportamiento interno y permite encontrar los errores de cdigo.

Las asignaciones de la gua permitieron complementar el rea terica de


la materia, ya que se aplicaron conceptos dados en clase y tambin se tuvo
que investigar ciertas instrucciones e interrupciones. Esto permiti un
acercamiento al lenguaje ensamblador para su aprendizaje.

Con la herramienta del tutorial que el software posee, se logr una


adaptacin ms rpida al lenguaje y al simulador. El tutorial posee una lista
de instrucciones e interrupcin que ayudaron a reducir el tiempo de
bsqueda en diferentes fuentes.

El lenguaje ensamblador permite una comprensin de la arquitectura


interna del microprocesador 8086, necesaria para el diseo correcto de
cdigo.

30

Vous aimerez peut-être aussi