1. El emu8086
El emu8086 es un emulador del microprocesador 8086 (Intel o AMD compatible) con
assembler integrado. A diferencia del entorno de programación en assembler utilizado
anteriormente en la cátedra (MASM), este entorno corre sobre Windows y cuenta con
una interfaz gráfica muy amigable e intuitiva que facilita el aprendizaje el leguaje de
programación en assembler.
Dado que en un entorno emulado de microprocesador no es posible implementar una
interfaz real de entrada/salida, el emu8086 permite interfacear con dispositivos virtuales
y emular una comunicación con el espacio de E/S. Para esto, el emu8086 cuenta con una
serie de dispositivos virtuales preexistentes en el software base, listos para ser utilizados,
entre los que se encuentran una impresora, un cruce de calles con semáforos, un
termómetro, un motor paso a paso, etc. No obstante, la cátedra ha desarrollado
dispositivos adicionales con características particulares para la realización del segundo
trabajo practico.
2. Se muestra a continuación una tabla comparativa con las diferencias entre el entorno de
programación en assembler utilizado anteriormente en la cátedra (MASM 6.11) y el nuevo
emu8086:
Emu 8086 Microsoft Assembler (MASM 6.11)
Entorno educativo Entorno para producción y educativo.
Basado en Windows Basado en DOS
En forma nativa admite dispositivos
virtuales.
No admite dispositivos virtuales en forma nativa
Set de instrucciones de 8086 Set de instrucciones del 8086, 80186/286/386/486
Directivas propias adicionales
Directivas comunes con TASAM (Borland Turbo
Assembler)
Emula interrupciones por Hw y Sw No permite emular interrupciones
Emula el espacio de E/S (instrucciones
IN y OUT)
No permite emular el espacio de E/S
Permite emular interrupciones. No permite emular intrrupciones.
Herramientas adicionales para el debug
8. Ejercicios:
1) Ejecutar el programa hola mundo, y debe cambiar los mensajes de pantalla al español.
Código:
name "hi-world"
; this example prints out "hello world!"
; by writing directly to video memory.
; in vga memory: first byte is ascii character, byte that follows is character attribute.
; if you change the second byte, you can change the color of
; the character even after it is printed.
; character attribute is 8 bit value,
; high 4 bits set background color and low 4 bits set foreground color.
; hex bin color
9. ; 0 0000 black
; 1 0001 blue
; 2 0010 green
; 3 0011 cyan
; 4 0100 red
; 5 0101 magenta
; 6 0110 brown
; 7 0111 light gray
; 8 1000 dark gray
; 9 1001 light blue
; a 1010 light green
; b 1011 light cyan
; c 1100 light red
; d 1101 light magenta
; e 1110 yellow
; f 1111 white
org 100h
; set video mode
mov ax, 3 ; text mode 80x25, 16 colors, 8 pages (ah=0, al=3)
int 10h ; do it!
; cancel blinking and enable all 16 colors:
mov ax, 1003h
mov bx, 0
int 10h
; set segment register:
mov ax, 0b800h
mov ds, ax
; print "hello world"
10. ; first byte is ascii code, second byte is color code.
mov [02h], 'H'
mov [04h], 'o'
mov [06h], 'l'
mov [08h], 'a'
mov [0ah], ','
mov [0ch], 'M'
mov [0eh], 'u'
mov [10h], 'n'
mov [12h], 'd'
mov [14h], 'o'
; color all characters:
mov cx, 12 ; number of characters.
mov di, 03h ; start from byte after 'h'
c: mov [di], 11101100b ; light red(1100) on yellow(1110)
add di, 2 ; skip over next ascii code in vga memory.
loop c
; wait for any key press:
mov ah, 0
int 16h
ret
11. 2) Compilar un programa en EMU8086 que indique lo siguiente: Nombre completo del
estudiante, Universidad, Fecha y materia.
Código:
.MODEL SMALL ;modelo pequeno de compilacion (64k como maximo)
.STACK 100h ;Segmento de pila: Pila 256 posiciones
CR EQU 13 ;Declaracion de constantes
LF EQU 10
.DATA ;Comienzo del segmento de datos
TEXTO DB 'Ruben Andres Pilca Ortiz PUCE-SI 26/04/2016
12. Compiladores$',CR,LF ;Reserva de memoria con retorno de carro e
;Inicio de linea, la variable TEXTO es de tipo
;byte,el simbolo $ es el simbolo de fin de cadena
.CODE ;Comienzo del segmento de código
MOV AX, SEG TEXTO ;Mueve a AX la direccion del primer byte del
;segmento de datos
MOV DS,AX ;Mueve dicha direccion al segmento de datos
LEA DX,TEXTO ;Cargamos en DX la dirección efectiva del texto
;que vamos a imprimir por pantalla
MOV AH,9 ;funcion "Escribir texto por pantalla"
INT 21h ;Llamada a DOS por medio de la interrupción
;para ejecutar la funcion
MOV AH,4ch ;funcion "Retornar a DOS"
INT 21h ;Interrupcion que llama a DOS para terminar el
;programa
END ;fin
13. 3) Compilar un programa que permita comparar 2 números del 0 al 9.
Código:
org 100h
mov ah, 4
mov al, 4
cmp ah, al
nop
; (signed/unsigned)
; 4 is above and greater then 3
mov ah, 4
mov al, 3
cmp ah, al
nop
14. ; -5 = 251 = 0fbh
; (signed)
; 1 is greater then -5
mov ah, 1
mov al, -5
cmp ah, al
nop
; (unsigned)
; 1 is below 251
mov ah, 1
mov al, 251
cmp ah, al
nop
; (signed)
; -3 is less then -2
mov ah, -3
mov al, -2
cmp ah, al
nop
; (signed)
; -2 is greater then -3
mov ah, -2
mov al, -3
cmp ah, al
nop
; (unsigned)
; 255 is above 1
mov ah, 255
15. mov al, 1
cmp ah, al
nop
; now a little game:
game: mov dx, offset msg1
mov ah, 9
int 21h
; read character in al:
mov ah, 1
int 21h
cmp al, '0'
jb stop
cmp al, '9'
ja stop
cmp al, '6'
jb below
ja above
mov dx, offset equal_5
jmp print
below: mov dx, offset below_5
jmp print
above: mov dx, offset above_5
print: mov ah, 9
int 21h
jmp game ; loop.
stop: ret ; stop
msg1 db "ingrese un numero u otro caracter para salir: $"
equal_5 db " es seis! (igual)", 0Dh,0Ah, "$"
16. below_5 db " es menor que seis!" , 0Dh,0Ah, "$"
above_5 db " is mayor que seis!" , 0Dh,0Ah, "$"
4) Compilar un programa que permita sumar 10 valores asignados a un vector.
org 100h
; number of elements:
mov cx, 10
; al will store the sum:
mov al, 0
; bx is an index:
mov bx, 0
; sum elements:
next: add al, vector[bx]
17. ; next byte:
inc bx
; loop until cx=0:
loop next
; store result in m:
mov m, al
; print result in binary:
mov bl, m
mov cx, 8
print: mov ah, 2 ; print function.
mov dl, '0'
test bl, 10000000b ; test first bit.
jz zero
mov dl, '1'
zero: int 21h
shl bl, 1
loop print
; print binary suffix:
mov dl, 'b'
int 21h
mov dl, 0ah ; new line.
int 21h
mov dl, 0dh ; carrige return.
int 21h
; print result in decimal:
mov al, m
call print_al
; wait for any key press:
18. mov ah, 0
int 16h
ret
; variables:
vector db 1, 2, 3, 4, 5, 6, 7, 8, 9, 6
m db 0
print_al proc
cmp al, 0
jne print_al_r
push ax
mov al, '0'
mov ah, 0eh
int 10h
pop ax
ret
print_al_r:
pusha
mov ah, 0
cmp ax, 0
je pn_done
mov dl, 10
div dl
call print_al_r
mov al, ah
add al, 30h
mov ah, 0eh
int 10h
jmp pn_done
19. pn_done:
popa
ret
endp
5) Compilar un programa sugerido por usted, como propuesta adicional.
Escribir un programa que dibuje una diagonal en la pantalla.
Código:
mov cx,1
mov al, 13h
mov ah, 0
int 10h ; set graphics video mode.
20. bucle1:
mov dx, cx
mov al, color ;AL = pixel color
mov ah, 0ch ;Change color for a single pixel
int 10h ;set pixel
cmp cx, 101 ;llegar hasta 100 x 100 (va en diagonal)
jz fin
inc cx ;DX = row.
add color, 2 ;para cambiar colores
jmp bucle1 ;CX = column
fin:
ret
color db 1