Anda di halaman 1dari 17

UNIVERSIDAD NACIONAL

AGRARIA DE LA SELVA
FIIS

EJERCICIOS DE
SIMULACION
ENASSEMBLER

INTEGRANTES:
BARRRIENTOS TRUJILLO ALVARO
CAJAS DIAZ JESUS
RUEDA LIBERATO EDGAR
UNAS-FIIS Arquitectura de computadoras Ejerc. de Laboratorio 2011-I

INTRODUCCION

El lenguaje ensamblador es un tipo de lenguaje de bajo nivel utilizado para escribir


programas informticos, y constituye la representacin ms directa del cdigo mquina
especfico para cada arquitectura de microprocesador.
Totalmente vinculados a la estructura del computador.
Diseados para sacar partido de la mquina.
Equivalente al lenguaje mquina, pero con cdigos de operacin, datos y referencias
simblicos.
Operaciones: cdigos nemotcnicos.
Datos y referencias: nombres simblicos.

Cada instruccin ensamblador se corresponde con una instruccin de mquina.


La importancia del lenguaje ensamblador es principalmente que se trabaja directamente
con el microprocesador; por lo cual se debe de conocer el funcionamiento interno de
este, tiene la ventaja de que en el se puede realizar cualquier tipo de programas que en
los lenguajes de alto nivel no lo pueden realizar. Otro punto sera que los programas en
ensamblador ocupan menos espacio en memoria.

Ing. Gregorio Vsquez EJERCICIOS DE SIMULACION .ASM


UNAS-FIIS Arquitectura de computadoras Ejerc. de Laboratorio 2011-I

1. Desarrollar un programa que imprima un nmero, que esta en un registro, en el sistema


hexadecimal

;********************UNIVERSIDAD NACIONAL AGRARIA DE LA SELVA **********************


;****************FACULTAD DE INGENIERIA EN INFORMATICA Y SISTEMAS*******************

;Desarrollar un programa que imprima un nmero, que esta en un registro, en el sistema hexadecimal
codigo segment
assume cs:codigo
inicio:
leer:
mov ah,6
mov dl,0ffh
int 21h
and al,al
jz leer
and al,0fh
mov dl,al
mov ah,2
int 21h
mov ah,4ch
int 21h
codigo ends
end inicio

2. Hacer un programa que despliegue el contenido de AX en decimal

;********************UNIVERSIDAD NACIONAL AGRARIA DE LA SELVA **********************


;****************FACULTAD DE INGENIERIA EN INFORMATICA Y SISTEMAS*******************

;Hacer un programa que despliegue el contenido de AX en decimal

codigo segment

assume cs:codigo
inicio:
push ax
xor ax,ax
mov ax,32h
aam
or ax,3030h
mov bx,ax
mov dl,bh
mov ah,2h
int 21h
mov dl,bl
mov ah,02h
int 21h
mov ah,4ch
int 21h
codigo ends
end inicio

Ing. Gregorio Vsquez EJERCICIOS DE SIMULACION .ASM


UNAS-FIIS Arquitectura de computadoras Ejerc. de Laboratorio 2011-I

3. Hacer un programa que reciba dos nmeros ingresados por teclado, y luego
muestre por pantalla el valor de la suma y el valor de la resta en formato
decimal.

.model small
.stack 100
.data
msj1 db 'Numero 1: ','$'
msj2 db 13,10,'Numero 2: ','$'
msj3 db 13,10,'Suma: ','$'
msj4 db 13,10,'Resta: ','$'
linea db 13,10,'$'
var1 db 0
var2 db 0
.code
.startup

call limpia
mov ah,09h
lea dx, msj1 ;desplegar numero 1:
int 21h

call leer ;lee primer numero


sub al,30h ;restar 30h para obtener el numero
mov var1,al ;lo guardo en var1
mov ah,09h
lea dx, msj2 ;desplegar numero 2:
int 21h

call leer ;lee segundo numero


sub al,30h ;restar 30h para obtener segundo valor
mov var2,al ;guardar en var2
mov bl,var2 ;mover a bl

;******************* SUMA
add bl,var1 ; realizo la suma de var2(bl) y var1 y el resultado queda en bl
mov ah,09h
lea dx,msj3 ;imprimir suma
int 21h
mov dl,bl ;pongo en dl el numero a imprimir var2(bl)
add dl,30h ; agrego 30h para obtener el caracter
mov ah,02h ;imprime un caracter
int 21h

;******************RESTA
mov bl,var1
sub bl,var2
mov ah,09h
lea dx,msj4 ;desplegar resta:
int 21h
mov dl,bl ;mover resta a dl para imprimir
add dl,30h ;sumar 30 para obtener caracter
mov ah,02h ;imprimir un caracter
int 21h
.exit

; ****************PROCEDIMIENTOS
salto proc near
mov ah,09h
lea dx,linea
int 21h
mov dl,00h
ret
salto endp

leer proc near


mov ah,01h;leer caracter desde el teclado
int 21h;lee primer caracter
ret
leer endp

limpia proc near


mov ah,00h

Ing. Gregorio Vsquez EJERCICIOS DE SIMULACION .ASM


UNAS-FIIS Arquitectura de computadoras Ejerc. de Laboratorio 2011-I

mov al,03h
int 10h
ret
limpia endp
end
Publica

4. Desarrollar un programa que determine si un nmero es primo o no y muestre en


pantalla los mensajes es primo, o no es primo.

;Desarrollar un programa que determine si un nmero es primo o no y muestre en pantalla los mensajes es primo,
o no es primo.
resp segment
pri db "Es primo $"
npri db "No es primo $"
resp ends
cod segment
assume cs:cod,ds:resp
inicio:
mov cx,resp
mov ds,cx
mov si,0
mov bl,1
mov cl,0
volver:mov al,6 ;se coloca aqui si el numero va ser primo o no primo
mov dl,al
mov ds:[100h],dl
mov ah,0
div bl
mov dl,ah
cmp dl,0
je l1
jmp jumpingsmall
l1:add cl,al
jumpingsmall:inc bl
mov dl,ds:[100h]
cmp bl,dl
jle volver
mov dl,ds:[100h]
add dl,1
cmp dl,cl
je ls
jmp jumping
ls:mov dx,offset pri
mov ah,09h
int 21h
jmp fin
jumping:mov dx,offset npri
mov ah,09h
int 21h
fin:
mov ah,4ch
int 21h
cod ends
end inicio

Ing. Gregorio Vsquez EJERCICIOS DE SIMULACION .ASM


UNAS-FIIS Arquitectura de computadoras Ejerc. de Laboratorio 2011-I

5. Desarrollar un programa en el cual se ingrese una cadena de caracteres por el


teclado lo almacene en la pila y luego se lo muestre por la pantalla en forma
invertida. Por ejemplo Ingresado: HOLA Salida: ALOH

assume cs:cseg, ds:dseg, ss:sseg

; Segmento de Codigo
cseg segment
inicio:
; ... Programar en este bloque ...
mov ax,dseg
mov ds,ax
mov cx,255
mov si,0

caracter:
mov ah,01h
int 21h
cmp al,0dh
je fin
push ax
add si,1
loop caracter

fin:
mov cx,255

mov ah,02h
mov dl,0ah
int 21h

mov cx,si
reves:
pop ax
mov dl,al
mov ah,02h
int 21h
loop reves
; ... llamada de fin de programa ...
mov ax, 4C00h
int 21h
cseg ends

; Segmento de Datos db,dw,dd,dq


dseg segment byte
tmp dw ?
dseg ends

; segmento de pila
sseg segment stack
db 100h dup(?)
sseg ends
end inicio

Ing. Gregorio Vsquez EJERCICIOS DE SIMULACION .ASM


UNAS-FIIS Arquitectura de computadoras Ejerc. de Laboratorio 2011-I

6. Hacer el programa para escribir un dato en el puerto paralelo, tambin hacer las
conexiones cable de impresora; protoboard; LEDs y resistencias adecuadas para
ver el dato escrito.(Direccin 378h; salida; tamao 8 bits; pines 2-9)

Este programa tiene como funcin demostrar como se puede escribir datos en un puerto,
en este caso usamos el puerto paralelo del PC el cual es sencillo de visualizar conectando
8 leds a los pines 2 a 9 cada uno en serie con una resistencia de 220 ohms, los datos
visualizados corresponden a las valores.

ASCII de la tecla presionada.


el programa termina cuando se presiona *
;Declaracin del segmento de pila
STACK SEGMENT PARA STACK 'STACK'
DB 256 DUP(0) ;256 BYTES DE ESPACIO EN EL STACK
STACK ENDS
ASSUME CS:COD ,DS:COD
COD SEGMENT
; Mensajes
MES1 DB 'EJEMPLO DE ACCESO A PUERTOS CARLOS FERNANDO JIMENEZ JULIO 19
DE 2005','$'
MES2 DB 'OPRIMA * PARA SALIR','$'
MES3 DB 'ADIOS','$'
MENSAJE DW 0
MAIN PROC FAR
MOV AX,CS
MOV DS,AX
; Escribir mensaje inicial
; EJEMPLO DE ACCESO A PUERTOS CARLOS FERNANDO JIMENEZ JULIO 19 DE 2005
; OPRIMA * PARA SALIR
MOV MENSAJE,OFFSET MES1
CALL ESCRIBIR
MOV MENSAJE,OFFSET MES2
CALL ESCRIBIR
;Bucle principal que captura los caracteres del teclado y enva su valor ASCII
; al bus de datos del puerto paralelo el corresponde a la direccin 378h
bucle:
; LEE EL CARACTER DEL TECLADO
MOV AH,1
MOV DL,0FFH
INT 21H
; Verifica si el carcter corresponde al * para salir del programa
CMP AL,'*' ;Compara el valor de AL con el valos ASCII del asterisco
JE ADIOS ;si la anterior comparacion dio igual saltar a adios
MOV DX,378H ; DIRECCION DEL PUERTO PARALELO
; El comando OUT tiene como funcin escribir en el puerto cuya direccin de 16 bits
;se encuentra almacenada en DX, el valor a escribir de 8 bits se almacena en AL
OUT DX,AL
JMP bucle
MAIN ENDP
;Rutina para desplegar mensajes
ESCRIBIR PROC NEAR
PUSH AX
PUSH DX
MOV AH,09H
MOV DX,MENSAJE
INT 21H

MOV AH,06

Ing. Gregorio Vsquez EJERCICIOS DE SIMULACION .ASM


UNAS-FIIS Arquitectura de computadoras Ejerc. de Laboratorio 2011-I

MOV DL,0DH
INT 21H
MOV AH,06H
MOV DL,0AH
INT 21H
POP DX
POP AX
RET
ESCRIBIR ENDP
; Rutina de salida
ADIOS:
;Se escribe un return o alimentacion de linea
MOV AH,06
MOV DL,0DH
INT 21H
MOV AH,06H
MOV DL,0AH
INT 21H
; Se escribe adis.
MOV MENSAJE,OFFSET MES3
CALL ESCRIBIR
; La funcio 4CH de la inte 21HF devuelve el control al sistema operativo
MOV AH,4CH
INT 21H
COD ENDS
END MAIN

7. Hacer un programa que busque en la pantalla de video la palabra FIIS, si FIIS


aparece en cualquier parte de la pantalla, despliega una Y , si FIIS no aparece
despliega una N. (Direccin de inicio de la memoria de video B800:0000)
Plantilla para Archivos EXE

assume cs:cseg, ds:dseg, ss:sseg

; Segmento de Codigo
cseg segment
inicio:
; ... Programar en este bloque ...
mov ax,0B800h
mov ds,ax
mov cx,0b800h
mov si,0
mov ax,0
for1:
mov al,fiis
cmp ds:[si],al
jne found
inc si
loop for1
mov ah,02h
mov dl,"Y"
int 21h
found:
mov ah,02h
mov dl,"N"
int 21h

Ing. Gregorio Vsquez EJERCICIOS DE SIMULACION .ASM


UNAS-FIIS Arquitectura de computadoras Ejerc. de Laboratorio 2011-I

; ... llamada de fin de programa ...


mov ax, 4C00h
int 21h
cseg ends

; Segmento de Datos db,dw,dd,dq


dseg segment byte
fiis db "FIIS$"
dseg ends

; segmento de pila
sseg segment stack
db 100h dup(?)
sseg ends
end inicio

8. Realizar un programa que genere nmeros aleatorios en decimal entre 0 y 1000


Plantilla para Archivos EXE

; multi-segment executable file template.

data segment
msg1 db 'Numero al azar: $'
numero dw ?, 0ah, 0dh, '$'
ends

stack segment
dw 128 dup(0)
ends

code segment
start:
mov cx,10
mov bx,12
inicio:
push cx
mov ax,data
mov ds,ax

lea dx, msg1


mov ah, 9
int 21h

Mov ah,2Ch
Int 21h

xor ax, ax
mov dh, 00h
add ax, dx
aaa
add ax, 3030h

mov numero[0], ax ; aleatorio de 2 digitos

Ing. Gregorio Vsquez EJERCICIOS DE SIMULACION .ASM


UNAS-FIIS Arquitectura de computadoras Ejerc. de Laboratorio 2011-I

mov ah, 00h


int 1AH

mov ax, dx
xor dx, dx
mov cx, 10
div cx
add dl, '0'
mov numero[2],dx

lea dx, numero


mov ah, 9
int 21h

pop cx
loop inicio
ends

end start ; set entry point and stop the assembler.

9. Ordenar los siguientes datos 5, 3, 4, 7, 1. (Usar datos db 5,3,4,7,1)

;.286
.model small
.stack 64h
.data
mens1 db 2 Dup(10,13)
db " Programa ORDENAR",10,13 ;0A,0D
db " ======== =======",10,13,10,13
db " [1] Ingresa Numeros ",10,13
db " [2] Ordena ",10,13
db " [3] Salir ",10,13,10,13
db "Ingrese seleccion ...$"

mens2 db 2 Dup(10,13)
db " Como Quieres ORDENAR?",10,13 ;0A,0D
db " ====================",10,13,10,13
db " [1] ASCENDENTE ",10,13
db " [2] DESCENDENTE ",10,13
db " [3] Regresar ",10,13,10,13
db "Ingrese seleccion ...$"

mens3 db 2 dup (10,13)


db "Ingresa Numero -> $"

merror_c db " Error !!!!",10,13


db " Solo debes ingresar Numeros $"

linea db 10,13," $"


NUMERO label byte
nmax db 3
nmet db ?
met db 3 dup (?)

numeros db 15 dup(0)

orden db 15 dup(0)

.code
mov ax,@data
mov ds,ax

Ing. Gregorio Vsquez EJERCICIOS DE SIMULACION .ASM


UNAS-FIIS Arquitectura de computadoras Ejerc. de Laboratorio 2011-I

de_nuevo:
call CLS
mov dx,offset mens1
mov ah,9
int 21h
ingreso1:
mov ah,7 ;Ingreso de caracter sin ECO
int 21h
cmp al,'1' ;OPCION INGRESAR
jz ingresar
cmp al,'2'
jz ordenar
cmp al,'3'
jz salir
mov dl,7
mov ah,2
int 21h
jmp ingreso1
salir: call CLS
mov ah,4ch
int 21h
ingresar: call ingresando
jmp de_nuevo
ordenar: call ordenando
jmp de_nuevo

;********************************* MIS RUTINAS *********************************


ordenando proc near
call CLS
mov dx,offset mens2
mov ah,9
int 21h
ingreso_o:
mov ah,7 ;Ingreso de caracter sin ECO
int 21h
cmp al,'1' ;ASCENDENTE
jz ascender
cmp al,'2'
jz descender
cmp al,'3'
jz salir_o
mov dl,7
mov ah,2
int 21h
jmp ingreso_o
salir_o:
ret
ascender:
call ascendente
ret
descender:
call descendente
ret
ordenando endp

ascendente proc near


lea di,orden
lea si,numeros
call copia

lea bx,orden
mov cx,15;cantidad maxima
ordena1_a:push cx
mov cx,14;maximo - 1
mov si,0
ordena2_a:mov ax,word ptr[bx+si]
xor dx,dx
mov dl,ah
mov ah,0
cmp dx,ax
jl cambio_a;si es menor cambia
sigue2_a: inc si
loop ordena2_a
pop cx
loop ordena1_a

Ing. Gregorio Vsquez EJERCICIOS DE SIMULACION .ASM


UNAS-FIIS Arquitectura de computadoras Ejerc. de Laboratorio 2011-I

jmp imprimesal_a
cambio_a:mov ah,dl
xchg ah,al
mov word ptr[bx+si],ax
jmp sigue2_a
imprimesal_a:
call a_ascii

mov ah,7
int 21h
ret
ascendente endp

descendente proc near


lea di,orden
lea si,numeros
call copia

lea bx,orden
mov cx,15
ordena1_d:push cx
mov cx,14
mov si,0
ordena2_d:mov ax,word ptr[bx+si]
xor dx,dx
mov dl,ah
mov ah,0
cmp dx,ax
jg cambio_d;si es menor cambia
sigue2_d: inc si
loop ordena2_d
pop cx
loop ordena1_d

jmp imprimesal_d
cambio_d:mov ah,dl
xchg ah,al
mov word ptr[bx+si],ax
jmp sigue2_d

imprimesal_d:
call a_ascii
mov ah,7
int 21h
ret
descendente endp

;************************************************************************************************
***********
;************************************ INGRESAR NUMEROS
**************************************************
;************************************************************************************************
***********
;************************************************************************************************
***********
;Rutina de Ingreso de Numeros
ingresando proc near
mov cx,15
mov di,0
mov si,0
repite_i: push cx
call CLS
rep_i: lea dx,mens3
mov ah,9
int 21h
lea DX,numero
mov ah,0AH
int 21h
cmp nmet,0
jz repite_i
call comprueba ;Si he metido numeros solamente
cmp ax,0 ;Si hay error

Ing. Gregorio Vsquez EJERCICIOS DE SIMULACION .ASM


UNAS-FIIS Arquitectura de computadoras Ejerc. de Laboratorio 2011-I

jz repite_e_i ;Salto a error en ingreso


sigue_i1: ;Caso contrario continuo
cmp nmet,1
jz es_1i
mov al,byte ptr met[1]
mov ah,byte ptr met[0] ;tengo en AX, numero metido
and ax,0F0Fh
jmp fin_i
es_1i: mov al,byte ptr met[0]
mov ah,0 ;tengo en AX, numero metido
and ax,0F0Fh
fin_i: SHL AL,4
SHR AX,4
mov numeros[si],al
inc si
pop cx
loop repite_i
ret

repite_e_i:
call CLS
lea DX,merror_c
mov ah,9
int 21h
jmp rep_i
ingresando endp

comprueba proc near


mov al,byte ptr met[0]
cmp al,'0'
jl error_c
cmp al,'9'
jg error_c
cmp nmet,2
jz es_2
ret
es_2: mov al,byte ptr met[1]
cmp al,'0'
jl error_c
cmp al,'9'
jg error_c
ret
error_c:
mov ax,0
ret
comprueba endp

a_ascii proc near


call CLS
pusha
LEA dx, linea
mov ah,9
int 21h
mov si,0
mov di,0
mov cx,15
rep_aa: mov al, byte ptr orden[di]
mov ah,0
shl ax,4
shr al,4
mov BX,3030H
add aX,BX
mov bx,ax
mov dl,ah
mov ah,2
int 21h
mov dl,Bl
mov ah,2
int 21h
mov dx,offset linea
mov ah,9
int 21h
inc di
loop rep_aa
popa

Ing. Gregorio Vsquez EJERCICIOS DE SIMULACION .ASM


UNAS-FIIS Arquitectura de computadoras Ejerc. de Laboratorio 2011-I

ret
a_ascii endp

; LIMPIA LA PANTALLA
; ------------------
;Borra la pantalla y pone el cursor en 0,0
CLS PROC NEAR
pusha
MOV AX,0600H ;REQUEST SCROLL SCREEN
MOV BH,07H ;NORMAL
MOV CX,0000H ;FROM 00,00
MOV DX,184FH ;TO 24,79
INT 10H ;CALL BIOS
MOV DX,0
MOV AH,02 ;REQUEST SET CURSOR
MOV BH,00 ;PAGE 10
INT 10H ;CALL BIOS
popa
RET
CLS ENDP

; UBICA EL CURSOR FILA/COLUMNA DE ACUERDO A DX


; --------------------------------------------
;
CURSOR PROC NEAR
pusha
MOV AH,02 ;REQUEST SET CURSOR
MOV BH,00 ;PAGE 10
INT 10H ;CALL BIOS
popa
RET
CURSOR ENDP
;

;****************COPIA de SI a DI ***********************
;Copia el contenido de SI a DI (datos en memoria)
copia proc near
mov cx,15
repasc: mov ah,byte ptr ds:[si];guarda un byte de si a ah
mov byte ptr ds:[di],ah
inc si
inc di
loop repasc
ret
copia endp
end

Ing. Gregorio Vsquez EJERCICIOS DE SIMULACION .ASM


UNAS-FIIS Arquitectura de computadoras Ejerc. de Laboratorio 2011-I

10. Hacer un programa que lea la posicin del Mouse

;Hacer un programa que lea la posicin del Mouse


assume cs:cseg, ds:dseg, ss:sseg

; Segmento de Codigo
cseg segment
inicio:
; ... Programar en este bloque ...
mov ax,dseg
mov ds,ax

;comprobarl la existencia del driver del ratn


mov ax,0
int 33h
cmp ax,0
je salir
;mostrar el cursor

mov ax,01h
int 33h

mov ax,03h
int 33h

mov vertical,dx
mov horizontal,cx

mov ah,09h
mov dx,offset vert
int 21h

mov ah,02h
mov si,0
mov cx,4
mostrar:
mov dx,vertical[si]
int 21h
inc si
loop mostrar

mov ah,02h
mov dl,0ah
int 21h

mov ah,09h
mov dx,offset horiz
int 21h

mov cx,4
mov si,0
mov ah,02h
mostrar2:
mov dx,horizontal[si]
int 21h
inc si
loop mostrar2
salir :
; ... llamada de fin de programa ...
mov ax, 4C00h
int 21h
cseg ends

; Segmento de Datos db,dw,dd,dq


dseg segment byte
vertical dw ?
vert db "vertical-> $"
horiz db "horizontal-> $"
horizontal dw ?
dseg ends

Ing. Gregorio Vsquez EJERCICIOS DE SIMULACION .ASM


UNAS-FIIS Arquitectura de computadoras Ejerc. de Laboratorio 2011-I

; segmento de pila
sseg segment stack
db 100h dup(?)
sseg ends
end inicio

Ing. Gregorio Vsquez EJERCICIOS DE SIMULACION .ASM


UNAS-FIIS Arquitectura de computadoras Ejerc. de Laboratorio 2011-I

Conclusin

En esta primera ocasin la misin era desarrollar los ejemplos que se propusieron
Uno para programar el los ejemplos por medio de un lenguaje ensamblador (emu8086) y
que permitiera ejecutar el programa que guardramos dentro del PC.

Una desventaja es que con este lenguaje sigue siendo necesario conocer muy bien el
hardware del ordenador. En otras palabras es necesario conocer a fondo la arquitectura
de la mquina para la que se va a programar, si es que queremos ir a programar
profundamente.

Ing. Gregorio Vsquez EJERCICIOS DE SIMULACION .ASM