Está en la página 1de 12

1.

Escribir un programa en ensamblador que muestre un mensaje por


pantalla mediante interrupciones:
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.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.

inc di
loop b_saludo
mov ax,4C00h
;
int 21h
;Terminar el programa
START ENDP
CODE ENDS
END START

115.
116.
Este programa pide el nombre al usuario y lo muestra por
pantalla:
117.
118.
;-----------------------------------------------------------------------------119.
;Definicion del segmento de datos
120.
;-----------------------------------------------------------------------------121.
DATOS SEGMENT
122.
mensaje
db "Ejercicios disponibles en:
www.victorsanchez2.net"
123.
pregunta_nombre db "Cual es tu nombre?: "
124.
nombre
db 64 DUP(0)
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
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.
START PROC
148.
;Inicializamos los registros de segmento
149.
mov ax,datos
150.
mov ds,ax
151.
mov ax,pila
152.
mov ss,ax
153.
mov ax,extra

154.
mov es,ax
155.
;Fin de las inicializaciones
156.
157.
;Limpiamos la pantalla
158.
mov ax,0B800h
;En esta direccion comienza la memoria de
video
159.
mov es,ax
;Lo cargamos en el segmento extra
160.
xor di,di
;Ponemos DI=0. Esto equivale a mov di,0, pero
161.
;xor di,di consume 3 ciclos de reloj y con mov 4
162.
mov cx,80*25
;El tamao total es 2000 (80 lineas x 25
columnas)
163.
164.
b_clear:
;Bucle que se encargara de recorrer los 2000
165.
;caracteres de la pantalla para limpiarla
166.
mov al,20h
;20h=" " Rellenar la pantalla con espacios
167.
mov ah,1bh
;Fondo azul, letras blancas
168.
mov es:[di],ax
169.
inc di
170.
inc di
171.
loop b_clear
172.
173.
;Mostramos un mensaje
174.
mov si,offset mensaje
175.
mov di,(80*10+10)*2 ;Linea 10, columna 10
176.
mov cx,49
;Tamao del mensaje
177.
178.
b_saludo:
;Bucle que se encargara de recorrer los 2000
179.
;caracteres de la pantalla para limpiarla
180.
mov al,[si]
181.
mov ah,1bh
;Fondo azul, letras blancas
182.
mov es:[di],ax
183.
inc si
;Pasamos a apuntar a la siguiente letra del saludo
184.
inc di
185.
inc di
186.
loop b_saludo
187.
188.
;Mensaje al usuario para que introduzca su nombre
189.
mov si,offset pregunta_nombre
190.
mov di,(80*12+10)*2
;Linea 12, columna 10
191.
mov cx,20
192.
193.
b_pide_nombre:
;Bucle que se encargara de recorrer los 2000
194.
;caracteres de la pantalla para limpiarla
195.
mov al,[si]
196.
mov ah,1bh
;Fondo azul, letras blancas
197.
mov es:[di],ax
198.
inc si
;Pasamos a apuntar a la siguiente letra del saludo
199.
inc di
200.
inc di
201.
loop b_pide_nombre
202.
203.
;Almacenamos el nombre
204.
mov ah,0Ah
205.
mov dx,offset nombre
206.
mov nombre[0],64
;Maximo numero de caracteres

207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.

int 21h
mov bx,0
muestra_nombre:
mov dl,nombre[bx+2]
mov ah,2
int 21h
;Escribir un caracter del nombre
inc bx
cmp bl,nombre[1]
;Compara con el numero de caracteres
jne muestra_nombre
mov ax,4C00h
int 21h

;
;Terminar el programa

START ENDP
CODE ENDS
END START

226.
227.
El mismo programa que antes, pero ahora con llamadas a
funciones:
228.
229.
;-----------------------------------------------------------------------------230.
;Definicion del segmento de datos
231.
;-----------------------------------------------------------------------------232.
DATOS SEGMENT
233.
mensaje
db "Ejercicios disponibles en:
www.victorsanchez2.net"
234.
pregunta_nombre db "Cual es tu nombre?: "
235.
nombre
db 256 DUP(0)
236.
DATOS ENDS
237.
238.
;-----------------------------------------------------------------------------239.
;Definicion del segmento de pila
240.
;-----------------------------------------------------------------------------241.
PILA SEGMENT STACK "STACK"
242.
db 40h DUP(0)
243.
PILA ENDS
244.
245.
;-----------------------------------------------------------------------------246.
;Definicion del segmento extra
247.
;-----------------------------------------------------------------------------248.
EXTRA SEGMENT
249.
RESULT DW 0,0
250.
EXTRA ENDS
251.
252.
;-----------------------------------------------------------------------------253.
;Definicion del segmento de codigo
254.
;-----------------------------------------------------------------------------255.
CODE SEGMENT
256.
assume CS:code,DS:datos,ES:extra,SS:pila

257.
258.
;-----------------------------------------------------------------------------259.
; Procedimiento inicial
260.
;-----------------------------------------------------------------------------261.
START PROC
262.
263.
call inicializa_seg
;Inicializa los registros de segmento
264.
call limpia_pantalla
;Limpiamos la pantalla
265.
call muestra_mensaje
;Mensaje de informacion
266.
call pide_nombre
;Pide el nombre al usuario
267.
call muestra_nombre
;Muestra por pantalla el nombre del
usuario
268.
269.
mov ax,4C00h
;
270.
int 21h
;Terminar el programa
271.
272.
START ENDP
273.
274.
275.
;-----------------------------------------------------------------------------276.
; inicializa_seg
277.
;
278.
; in:
279.
; out:
Los registros de segmento quedan inicializados
280.
; machaca: AX, DS, SS, ES
281.
; make: Inicializa los registros de segmento
282.
;
283.
;-----------------------------------------------------------------------------284.
inicializa_seg proc near
285.
286.
mov ax,datos
287.
mov ds,ax
288.
mov ax,pila
289.
mov ss,ax
290.
mov ax,extra
291.
mov es,ax
292.
293.
ret
294.
295.
inicializa_seg endp
296.
297.
298.
;-----------------------------------------------------------------------------299.
; limpia_pantalla
300.
;
301.
; in:
302.
; out:
303.
; machaca: DI, ES
304.
; make:
Limpia la pantalla escribiendo espacios en las 80x25
posiciones de
305.
;
la pantalla, accediendo a la memoria de video
306.
;
307.
;-----------------------------------------------------------------------------308.
limpia_pantalla proc near
309.

310.
push ax
;Guardar en la pila las variables que queremos
311.
push cx
;conservar para cuando salgamos de la funcion
312.
313.
mov ax,0B800h
;En esta direccion comienza la memoria de
video
314.
mov es,ax
;Lo cargamos en el segmento extra
315.
xor di,di
;Inicializar DI a 0
316.
mov cx,80*25
;El tamao total es 2000 (80 lineas x 25
columnas)
317.
318.
b_clear:
;Bucle que se encargara de recorrer los 2000
319.
;caracteres de la pantalla para limpiarla
320.
mov al,20h
;20h=" " Rellenar la pantalla con espacios
321.
mov ah,1bh
;Fondo azul, letras blancas
322.
mov es:[di],ax
323.
inc di
324.
inc di
325.
loop b_clear
326.
327.
pop cx
;Importante sacarlas en orden contrario al que las
328.
pop ax
;guardamos
329.
330.
ret
331.
332.
limpia_pantalla endp
333.
334.
;-----------------------------------------------------------------------------335.
; muestra_mensaje
336.
;
337.
; in:
338.
; out:
339.
; machaca: DI, SI
340.
; make:
Muestra un mensaje por pantalla indicando en que pagina
se pueden
341.
;
encontrar los ejercicios
342.
;
343.
;-----------------------------------------------------------------------------344.
muestra_mensaje proc near
345.
346.
push ax
347.
push cx
348.
push es
349.
350.
351.
mov si,offset mensaje
352.
mov di,(80*10+10)*2 ;Linea 10, columna 10
353.
mov cx,49
;Tamao del mensaje
354.
355.
b_saludo:
;Bucle que se encargara de recorrer los 2000
356.
;caracteres de la pantalla para limpiarla
357.
mov al,[si]
358.
mov ah,1bh
;Fondo azul, letras blancas
359.
mov es:[di],ax
360.
inc si
;Pasamos a apuntar a la siguiente letra del saludo
361.
inc di

362.
inc di
363.
loop b_saludo
364.
365.
pop es
366.
pop cx
367.
pop ax
368.
369.
ret
370.
371.
muestra_mensaje endp
372.
373.
;-----------------------------------------------------------------------------374.
; pide_nombre
375.
;
376.
; in:
377.
; out:
378.
; machaca: DI, SI, DX
379.
; make:
Pide el nombre al usuario para que lo introduzca por
pantalla
380.
;
381.
;-----------------------------------------------------------------------------382.
pide_nombre proc near
383.
384.
push ax
385.
push cx
386.
push es
387.
388.
389.
;Mensaje al usuario para que introduzca su nombre
390.
mov si,offset pregunta_nombre
391.
mov di,(80*12+10)*2
;Linea 12, columna 10
392.
mov cx,20
393.
394.
b_pide_nombre:
;Bucle que se encargara de recorrer los 2000
395.
;caracteres de la pantalla para limpiarla
396.
mov al,[si]
397.
mov ah,1bh
;Fondo azul, letras blancas
398.
mov es:[di],ax
399.
inc si
;Pasamos a apuntar a la siguiente letra del saludo
400.
inc di
401.
inc di
402.
loop b_pide_nombre
403.
404.
;Almacenamos el nombre
405.
mov ah,0Ah
406.
mov dx,offset nombre
407.
mov nombre[0],64
;Maximo numero de caracteres
408.
int 21h
409.
410.
pop es
411.
pop cx
412.
pop ax
413.
414.
ret
415.

416.
417.
418.
419.
420.
421.
422.
423.
424.
425.
426.
427.
428.
429.
430.
431.
432.
433.
434.
435.
436.
437.
438.
439.
440.
441.
442.
443.
444.
445.
446.
447.
448.
449.
450.
451.
452.
453.
454.
455.
456.
457.
458.
459.
460.

pide_nombre endp
;-----------------------------------------------------------------------------; muestra_nombre
;
; in: nombre contiene el nombre de usuario que se ha introducido
; out:
; machaca: DI, SI
; make: Muestra el nombre al usuario por pantalla
;
;-----------------------------------------------------------------------------muestra_nombre proc near
push ax
push cx
push es
mov ax,0B800h
mov es,ax
xor dx,dx
mov si,offset nombre+2
mov di,(80*12+31)*2
;Linea 12, columna 31
mostrar_nombre:
mov al,[si]
mov ah,1bh
;Fondo azul, letras blancas
mov es:[di],ax
inc dx
;Cuenta el numero de caracteres
inc si
inc di
inc di
cmp dl,nombre[1]
;Comparar con el numero de caracteres
jne mostrar_nombre
pop es
pop cx
pop ax
ret
muestra_nombre endp
CODE ENDS
END START

461.
462.

Programa que calcula el factorial de 3 y lo muestra por pantalla:


463.
464.
465.
466.
467.

;-----------------------------------------------------------------------------;Definicion del segmento de datos


;-----------------------------------------------------------------------------DATOS SEGMENT

468.
469.
470.
471.
472.
473.
474.
475.
476.
477.
478.
479.
480.
481.
482.
483.
484.
485.
486.
487.
488.
489.
490.
491.
492.
493.
494.
495.
496.
497.
498.
alto
499.
500.
501.
502.
503.
504.
505.
506.
507.
508.
509.
510.
511.
512.
513.
514.
515.
516.
517.
518.
519.
520.
521.

dato

db 3 ;Numero del que calcularemos su factorial

DATOS ENDS
;-----------------------------------------------------------------------------;Definicion del segmento de pila
;-----------------------------------------------------------------------------PILA SEGMENT STACK "STACK"
db 40h dup(0)
PILA ENDS
;-----------------------------------------------------------------------------;Definicion del segmento extra
;-----------------------------------------------------------------------------EXTRA SEGMENT
result dw 0,0
;2 palabras (4 bytes)
EXTRA ENDS
;-----------------------------------------------------------------------------;Definicion del segmento de codigo
;-----------------------------------------------------------------------------CODE SEGMENT
assume CS:code,DS:datos,ES:extra,SS:pila
factorial db 0

;Variable para guardar el factorial

START PROC
call inicializar
mov sp,64

;Inicializa los registros de segmento


;Carga el puntero de pila con el valor mas

mov cl,dato
call calcula_factorial ;Calcula el faltorial de dato
mov factorial,al
;Almacenar el resultado en factorial
call muestra_factorial ;Muestra el valor del factorial
mov ax,4C00h
int 21h

;
;Terminar el programa

START ENDP
;-----------------------------------------------------------------------------; inicializar
;
; in:
; out:
Los registros de segmento quedan inicializados
; machaca: AX, DS, SS, ES
; make: Inicializa los registros de segmento
;
;-----------------------------------------------------------------------------inicializar proc near

522.
523.
524.
525.
526.
527.
528.
529.
530.
531.
532.
533.
534.
535.
536.
537.
538.
539.
540.
541.
542.
543.
544.
545.
546.
547.
548.
549.
550.
551.
552.
553.
554.
555.
556.
557.
558.
559.
560.
561.
562.
563.
564.
565.
566.
567.
568.
569.
570.
571.
572.
573.
574.
575.
576.

mov
mov
mov
mov
mov
mov

ax,datos
ds,ax
ax,pila
ss,ax
ax,extra
es,ax

ret
inicializar endp
;-----------------------------------------------------------------------------; calcula_factorial
;
; in:
CL contiene el dato
; out:
Devuelve en AX el resultado de calcular el factorial
; machaca: AX, CX
; make: Inicializa los registros de segmento y el puntero de pila
;
;-----------------------------------------------------------------------------calcula_factorial proc near
mov ax,1
xor ch,ch
cmp cx,0
je fin

;Si el numero es 0
;terminamos

factor:
mul cx
dec cx
jne factor
fin:
ret
calcula_factorial endp
;-----------------------------------------------------------------------------; muestra_nombre
;
; in: nombre contiene el nombre de usuario que se ha introducido
; out:
; machaca: DI, SI
; make: Muestra el valor del factorial por pantalla
;
;-----------------------------------------------------------------------------muestra_factorial proc near
push ax
push cx
push es
mov ax,0B800h
mov es,ax
mov dl,factorial

;Apuntar a la memoria de video

577.
578.
579.
580.
581.
582.
583.
584.
585.
586.
587.
588.
589.
590.

mov
add
mov
mov

di,(80*12+31)*2
;Linea 12, columna 31
dl,30h
;Obtener el valor en ASCII ('0'=30h)
dh,1bh
es:[di],dx

pop es
pop cx
pop ax
ret
muestra_factorial endp
CODE ENDS
END START