Académique Documents
Professionnel Documents
Culture Documents
DATOS SEGMENT
MENSAJE DB "HOLA MUNDO$"
DATOS ENDS
PILA
.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
INC BX
LOOP ETA
MOV AX,4C00H
INT 21H
EMPIEZA ENDP
CODIGO ENDS
END EMPIEZA
.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
mov AX, 5
mov BX, 5
;mov DX, AX
;mov AX,DX
ret
Emulador EMU8086
10:21 Programacion 2 Comentarios
Ensamblador. Por favor note que el programa est compuesto de diferentes bloques
Directivas de pre proceso: Le indican al compilador que debe realizar una serie de
acciones particulares en el momento de convertir el archivo fuente (ASM) en archivo
objeto (OBJ).
Segmento de Cdigo: Donde especifica lo que deseamos que el programa haga. Para
especificarlo se pueden usar: instrucciones (propias del microprocsador), Macroinstrucciones (similar a los comandos de los lenguajes de alto nivel) y procedimientos
(similar a las funciones definidas por el usuario de los lenguajes de alto nivel).
Directiva que indica el fin del archivo, cualquier instruccin posterior a esta lnea Ser
ignorada.
Digite el cdigo en el IDE, note como se le asignan diferentes colores a las lneas,
dependiendo si son instrucciones, macro-instrucciones, comentarios, cadenas de texto
(formato ASCII), directivas, etc.
Emule el archivo EXE presionando el botn emulate. Notar que se abren dos
ventanas: Una llamada emulator en la que podr monitorear la mayora de procesos
al ejecutar el programa y otra llamada original sourse code que muestra el cdigo
fuente del archivo, esta ventana es diferente de la que observa en el IDE porque en
sta podr observar cual instruccin esta a punto de ejecutarse, es ideal al corre
programas pasos a paso.
Ahora observe con ms detenimiento la ventana llamada emulator Figura 6, sta ser
la que ms utilice a la hora de ejecutar las prcticas de laboratorio, por lo que es
importante que la conozca y maneje de forma efectiva.
File, permite administrar (cargar o salvar) los archivos que va creando o ejecutando
Math, da acceso a una calculadora y un convertidor de basas de numeracin.
Debug, provee herramientas para depurar programas.
View, permite abrir otras ventanas que pueden ser de mucha ayuda al ejecutar o
depurar programas.
External, permite ejecutar el programa con otras herramientas diferentes del
EMU8086.
Virtual devices, activa los dispositivos virtuales con que cuenta el programa, dado que
se trata de un emulador no se tiene acceso a los puertos fsicos de la computadora,
por lo que estos son simulados.
Step back, retrocede una instruccin que ya fue ejecutada (funcin muy til al depurar
un programa)
Parte derecha, donde puede observar el contenido de la memoria, pero esta vez no se
detalla con direcciones especficas, sino que cada bloque de datos es interpretado
como un conjunto de instrucciones (lo que llamaremos programa DESENSAMBLADO)
que el microprocesador deber ejecutar. Es importante mencionar que algunas
instrucciones se expresan solo con un byte, pero otras necesitan varios bytes para ser
expresadas
Parte inferior, contiene una serie de botones que permiten un acceso rpido a una
serie de ventanas auxiliares, algunas de las cuales se puede activar tambin en la
barra de herramientas con la opcin view
Regresando a la estructura del programa estudiemos el Segmento de Datos: Puede
observar que se hab declarado tres cadenas de datos llamadas frase, frase_2 y lnea;
note que luego del nombre de la cadena de ha incluido la directiva db (definir byte) que
indica al compilador que ese es el tipo de datos que contendr la cadena. A parte de
eso en las primeras dos cadenas se han usado comillas simples para definir el
contenido, eso indica al compilador que el texto debe ser interpretado como caracteres
ASCII. En el caso de la ltima cadena los datos no estn entre comillas, lo que indica
que sern interpretados como datos hexadecimales.
Para ejecutar el programa presione el botn RUN: note que automticamente se activo
la ventana emulator screen en la que se pueden observar dos textos impresos, que
corresponden la frase y frase_2. Vamos a estudiar ms detenidamente la ejecucin del
programa.
Cierre la ventana emulator screen
Presione el botn single step note que se ha avanzado una sola lnea, dado que se
ejecuta una nica instruccin, Tambin se han dado cambios en los registros del
microprocesador, pero stos se analizarn en la primera gua de laboratorio. Ejecute la
siguiente instruccin, de igual manera se avanz solo un paso.
Ahora la lnea marcada no es de color azul, sino negra, en este caso indica que se
trata de una Macroinstruccin, que contiene un conjunto completo de instrucciones que
se ejecutan en bloque.
La lgica de esta estructura tiene varias formas de utilizacin, en este caso se
asemejan a formas que ya aplic programando en alto nivel, invoca a una funcin
predefinida en una librera o biblioteca (printf o putchar) y para hacerlo, al inicio tiene
que colocar una sentencia #include.
Como su nombre lo indica la macroinstruccin imprime una cadena de texto en la pantalla.
Esta cadena se especifica pasndole un parmetro a la funcin, la palabra frase.
Presione nuevamente single step observe que en la ventana emulator si se ha
avanzado en original sourse code y no se avanzar hasta ejecutar todas las
instrucciones que conforman la macroinstruccin.
Presione tres veces single step se activar de forma automtica la ventana emulator
screen e imprimiendo el texto de la cadena frase, note que el signo de dlar $ final
no se ha impreso.
Presione nuevamente single step y se marca la siguiente macroinstruccin, que
imprimir la cadena lnea.
Esta cadena no se declarado de la misma forma que las otras, pero aun as se
imprime, un detalle importante es que al final de esta cadena se encuentra el dato 24h
que corresponde al cdigo ASCII del signo de dlar.
Presione cinco veces single step con esto ha bajado el cursor a la siguiente lnea,
como si hubiera presionado ENTER en un editor de texto.
Presione cinco veces single step para imprimir la cadena frase_2
Ahora aparece marcada una lnea de instruccin (recuerde el color azul). Analicemos
su estructura, La estructura sintctica de las lneas de instruccin est formada por
elementos llamados campos, dependiendo la instruccin especfica se puede tener
uno o varios campos.
Primer campo se le llama cdigo de operacin e indica que es lo deseamos que
realice el microprocesador, bsicamente nos referimos a la instruccin en misma.
listadas las tres variables declaradas al inicio del archivo fuente como se muestra en la
Figura 8a.
Note que aparece marcada la variable frase e indica que su contenido es 48
hexadecimal (indicado por la casilla llamada show as), pero sabemos que esta
variable contiene ms datos, para poder verlos todos juntos, cambien el datos en la
casilla elements de 1 a 7, observar una serie de datos hexadecimales. Puede
cambiar la representacin a datos ASCII cambiando la opcin en la casilla show as y
verificar que efectivamente es el contenido de la cadena frase, Figura 8b. Si durante
la ejecucin del programa el contenido de la cadena cambia en esta ventana podr
observarlo.
Marque la segunda variable llamada frase_2 observe la informacin, se le indica que
el contiene el dato 53h, cambie la representacin de datos a ASCII y la cantidad de
elementos de 1 a 8, debera observas la misma informacin que ve en la Figura 8c.
Ahora marque la tercera variable lnea, el contenido es 0Ah, cambie a representacin
ASCII y 3 elementos, debera observas la misma informacin que ve en la Figura 8d.
Bueno con estas ideas bsicas podr iniciar el estudio de la programacin en lenguaje
ensamblador apoyndose en los recursos que le brinda el EMU8086, adelante
2.
3. ;----------------------------------------------------------------------------4. ;Definicion del segmento de datos
5. ;----------------------------------------------------------------------------6. DATOS SEGMENT
7.
8.
saludo db "Hola mundo!!!","$"
9.
10. DATOS ENDS
11.
12. ;----------------------------------------------------------------------------13. ;Definicion del segmento de codigo
14. ;----------------------------------------------------------------------------15. CODE SEGMENT
16.
assume cs:code,ds:datos
17.
18. START PROC
19.
mov ax,datos
;
20.
mov ds,ax
;Inicializar
21.
22.
mov dx,offset saludo
;Cargar la direccion del saludo
23.
mov
ah,9
;Opcion que va a servir a la
interrupcion 21h para
24.
;indicar que debe mostrar por
pantalla el offset
25.
;que hay en DX hasta que encuentre el
caracter '$'
26.
int 21h
;Interrupcion que lo mostrara por
pantalla
27.
28.
mov ax,4C00h
;
29.
int 21h
;Terminar el programa
30.
31. START ENDP
32.
33. CODE ENDS
34.
END START
35.
36.
Escribir un programa en ensamblador que muestre
un mensaje por pantalla accediendo a la memoria de
video (0B800h):
37.
38. ;----------------------------------------------------------------------------39. ;Definicion del segmento de datos
40. ;----------------------------------------------------------------------------41. DATOS SEGMENT
42.
saludo db "Hola mundo!!!"
43. DATOS ENDS
44.
45. ;----------------------------------------------------------------------------46. ;Definicion del segmento de pila
47. ;----------------------------------------------------------------------------48. PILA SEGMENT STACK "STACK"
49.
DB 40 DUP(0)
50. PILA ENDS
51.
52. ;----------------------------------------------------------------------------53. ;Definicion del segmento extra
54. ;----------------------------------------------------------------------------55. EXTRA SEGMENT
56.
RESULT DW 0,0
57. EXTRA ENDS
58.
59. ;----------------------------------------------------------------------------60. ;Definicion del segmento de codigo
61. ;----------------------------------------------------------------------------62. CODE SEGMENT
63.
assume cs:code,ds:datos,es:extra,ss:pila
64.
65. START PROC
66.
;Inicializamos los registros de segmento
67.
mov ax,datos
68.
mov ds,ax
69.
mov ax,pila
70.
mov ss,ax
71.
mov ax,extra
72.
mov es,ax
73.
;Fin de las inicializaciones
74.
75.
;Limpiamos la pantalla
76.
mov ax,0B800h
;En esta direccion comienza la memoria de
video
77.
mov es,ax
;Lo cargamos en el segmento extra
78.
xor di,di
;Ponemos DI=0. Esto equivale a mov di,0,
pero
79.
;xor di,di consume 3 ciclos de reloj y con
mov 4
80.
mov cx,80*25
;El tamao total es 2000 (80 lineas x 25
columnas)
81.
82. b_clear:
;Bucle que se encargara de recorrer los
2000
83.
;caracteres de la pantalla para limpiarla
84.
mov
al,20h
;20h=" "
Rellenar la pantalla con
espacios
85.
mov ah,1bh
;Fondo azul, letras blancas
86.
mov es:[di],ax
87.
inc di
88.
inc di
89.
loop b_clear
90.
91.
mov ax,0B800h
92.
mov es,ax
93.
mov si,offset saludo
94.
mov di,(80*7+17)*2 ;Linea 7, caracter 18
95.
mov cx,13
96.
97. b_saludo:
;Bucle que se encargara de recorrer los
2000
98.
;caracteres de la pantalla para limpiarla
99.
mov al,[si]
100.
mov ah,1bh
;Fondo azul, letras blancas
101.
mov es:[di],ax
102.
inc si
;Pasamos a apuntar a la siguiente
letra del saludo
103.
inc di
104.
inc di
105.
loop b_saludo
106.
107.
108.
109.
110.
111.
112.
113.
114.
mov
int
ax,4C00h
21h
;
;Terminar el programa
START ENDP
CODE ENDS
END START
115.
116.
Programa que calcula el factorial de 3 y lo muestra
por pantalla:
117.
118.
;----------------------------------------------------------------------------119.
;Definicion del segmento de datos
120.
;----------------------------------------------------------------------------121.
DATOS SEGMENT
122.
123.
dato
db 3 ;Numero del que calcularemos su factorial
124.
125.
DATOS ENDS
126.
127.
;----------------------------------------------------------------------------128.
;Definicion del segmento de pila
129.
;----------------------------------------------------------------------------130.
PILA SEGMENT STACK "STACK"
131.
db 40h dup(0)
132.
PILA ENDS
133.
134.
;----------------------------------------------------------------------------135.
;Definicion del segmento extra
136.
;----------------------------------------------------------------------------137.
EXTRA SEGMENT
138.
result
dw 0,0
;2 palabras (4 bytes)
139.
EXTRA ENDS
140.
141.
;----------------------------------------------------------------------------142.
;Definicion del segmento de codigo
143.
;----------------------------------------------------------------------------144.
CODE SEGMENT
145.
assume CS:code,DS:datos,ES:extra,SS:pila
146.
147.
factorial db 0
;Variable para guardar el
factorial
148.
149.
START PROC
150.
151.
call inicializar
;Inicializa los registros de
segmento
152.
mov sp,64
;Carga el puntero de pila con
el valor mas alto
153.
154.
mov cl,dato
155.
call calcula_factorial
;Calcula el faltorial de dato
156.
mov
factorial,al
;Almacenar el resultado en
factorial
157.
call muestra_factorial
;Muestra el valor del factorial
158.
159.
mov ax,4C00h
;
160.
int 21h
;Terminar el programa
161.
162.
163.
START ENDP
164.
165.
;----------------------------------------------------------------------------166.
; inicializar
167.
;
168.
; in:
169.
; out:
Los registros de segmento quedan inicializados
170.
; machaca: AX, DS, SS, ES
171.
; make:
Inicializa los registros de segmento
172.
;
173.
;----------------------------------------------------------------------------174.
inicializar proc near
175.
176.
mov ax,datos
177.
mov ds,ax
178.
mov ax,pila
179.
mov ss,ax
180.
mov ax,extra
181.
mov es,ax
182.
183.
ret
184.
185.
inicializar endp
186.
187.
;----------------------------------------------------------------------------188.
; calcula_factorial
189.
;
190.
; in:
CL contiene el dato
191.
; out:
Devuelve en AX el resultado de calcular el
factorial
192.
; machaca: AX, CX
193.
; make:
Inicializa los registros de segmento y el puntero
de pila
194.
;
195.
;----------------------------------------------------------------------------196.
calcula_factorial proc near
197.
198.
mov ax,1
199.
xor ch,ch
200.
cmp cx,0
;Si el numero es 0
201.
je
fin
;terminamos
202.
203.
factor:
204.
mul cx
205.
dec cx
206.
jne factor
207.
208.
fin:
209.
ret
210.
211.
calcula_factorial endp
212.
213.
;----------------------------------------------------------------------------214.
; muestra_nombre
215.
;
216.
; in: nombre contiene el nombre de usuario que se ha
introducido
217.
; out:
218.
; machaca: DI, SI
219.
; make:
Muestra el valor del factorial por pantalla
220.
;
221.
;----------------------------------------------------------------------------222.
muestra_factorial proc near
223.
224.
push ax
225.
push cx
226.
push es
227.
228.
mov ax,0B800h
229.
mov es,ax
;Apuntar a la memoria de video
230.
mov dl,factorial
231.
mov di,(80*12+31)*2
;Linea 12, columna 31
232.
add dl,30h
;Obtener el valor en ASCII
('0'=30h)
233.
mov dh,1bh
234.
mov es:[di],dx
235.
236.
pop es
237.
pop cx
238.
pop ax
239.
240.
ret
241.
242.
muestra_factorial endp
243.
244.
CODE ENDS
END START
;----------------------------------------------------------------------------;Definicion del segmento de pila
;----------------------------------------------------------------------------PILA SEGMENT STACK "STACK"
db
40h dup(0)
PILA ENDS
;----------------------------------------------------------------------------;Definicion del segmento de codigo
;----------------------------------------------------------------------------CODE SEGMENT
assume CS:code, SS:pila
START:
mov
neg
al,8
al
mov
int
ax,4C00h
21h
CODE ENDS
END START
;Convertir a su complemento a 2
Ejemplos en assembler