6. 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 práctico.
7. Se muestra a continuación una tabla comparativa con las
diferencias entre el entorno de programación en assembler
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
8. utilizado anteriormente en la cátedra (MASM 6.11) y el nuevo
emu8086:
Codigo hola mundo
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:
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
9. mov ax, 0b800h
mov ds, ax
; print "hello world"
; 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'
mov [16h], '!'
mov [18h], '!'
; 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)
10. 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. Código Nombre Universidad Fecha Materia
.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 'Diego Andres Pozo Andrade PUCE-SI
26/04/2016 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
12. ;para ejecutar la funcion
MOV AH,4ch ;funcion "Retornar a DOS"
INT 21h ;Interrupcion que llama a DOS para terminar el
;programa
END ;fin
Captura pantalla
13. Código comparar dos números
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
; -5 = 251 = 0fbh
; (signed)
; 1 is greater then -5
mov ah, 1
mov al, -5
cmp ah, al
nop
; (unsigned)
14. ; 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
16. 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, "$"
below_5 db " es menor que seis!" , 0Dh,0Ah, "$"
above_5 db " is mayor que seis!" , 0Dh,0Ah, "$"
Captura
17. Código suma 10 números
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]
; 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.
18. 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:
mov ah, 0
int 16h
19. 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
21. Código programa sugerido (Dibujar Diagonal)
mov cx,1
mov al, 13h
mov ah, 0
int 10h ; set graphics video mode.
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