Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
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
;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
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
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
;******************* 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
mov al,03h
int 10h
ret
limpia endp
end
Publica
;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
; 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 pila
sseg segment stack
db 100h dup(?)
sseg ends
end inicio
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.
MOV AH,06
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
; 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
; segmento de pila
sseg segment stack
db 100h dup(?)
sseg ends
end inicio
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
Mov ah,2Ch
Int 21h
xor ax, ax
mov dh, 00h
add ax, dx
aaa
add ax, 3030h
mov ax, dx
xor dx, dx
mov cx, 10
div cx
add dl, '0'
mov numero[2],dx
pop cx
loop inicio
ends
;.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 ...$"
numeros db 15 dup(0)
orden db 15 dup(0)
.code
mov ax,@data
mov ds,ax
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
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
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
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
repite_e_i:
call CLS
lea DX,merror_c
mov ah,9
int 21h
jmp rep_i
ingresando endp
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
;****************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
; Segmento de Codigo
cseg segment
inicio:
; ... Programar en este bloque ...
mov ax,dseg
mov ds,ax
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 pila
sseg segment stack
db 100h dup(?)
sseg ends
end inicio
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.