.model tiny
.stack
.data
cad db 'Estas en $'
unidad db 'ABCDEFGH'
ruta db 30 dup(' '),'$'
.code
.startup
mov ah,19h ;Me fijo en que Unidad estas
int 21h
push ax
mov ah,09h
lea dx,cad ;Posiciono la direccion de la cadena
int 21h
pop ax
mov bl,al
mov dl,unidad[BX] ;posiciono la direccion en la cadena,
;en la letra donde estoy
mov ah,02h
int 21h
mov ah,47h ;Optener la carpta en que estoy
mov dl,03h ;Unidad donde quiero conocer el directorio
lea si,ruta ;En ruta guarde el nombre de directorio en el
;que estoy
int 21h
mov ah,09h
LEA DX, ruta
int 21h
.exit
end
En este programa se muestra como leer u obtener el directorio en donde te encuentras actualmente, asi como poder cambiarte de directorio y de unidad.
;porgrama que cambia de direcctorio y de unidad como
;el ms-dos www.pro-gramas.com
.model tiny
.data
opc1 db '1.- Cambiar unidad$'
opc2 db '2.- Cambiar directorio$'
opc3 db 'Salir [enter] -> $'
ms1 db 'Url -> $'
ms2 db 'Unidad -> $'
ms3 db 'Directorio (\) -> $'
unidad db 'ABCDEFGH'
ruta db 30 dup(' ')
dir db 30 dup(' ')
.code
clear macro
mov ah,00h ;limpia la pantalla
mov al,03h
int 10h
endm
gotoxy macro fil,col
mov ah,02h ;posiciona el cursor
mov dh,fil ;fila
mov dl,col ;columna
mov bh,0 ;pagina de video
int 10h
endm
write macro ;escribe una cadena
mov ah,09h
int 21h
endm
writec macro ;escribe un caracter
mov ah,02h
int 21h
endm
cuadro macro fi,ff,ci,cf
local etiqueta
local etiqueta2
mov cl,ci
etiqueta: ;ciclo para mostrar la fila superior
gotoxy fi,cl ;fila superior
mov ah,02h ;inter. imprimir
mov dl,205 ;movemos a dl
int 21h
gotoxy ff,cl ;fila inferior
mov ah,02h
mov dl,205
int 21h
inc cl
cmp cl,cf
jne etiqueta ;ciclo aumenta + 1
mov cl,fi
etiqueta2:
gotoxy cl,ci ;columna izquierda
mov ah,02h
mov dl,186
int 21h
gotoxy cl,cf ;columna derecha
mov ah,02h
mov dl,186
int 21h
inc cl
cmp cl,ff
jne etiqueta2 ;ciclo aumenta + 1
gotoxy fi,ci ;mostrar el codo superior izq
mov ah,02h
mov dl,201
int 21h
gotoxy fi,cf ;mostrar el codo superior der
mov ah,02h
mov dl,187
int 21h
gotoxy ff,ci ;mostrar el codo inferior izq
mov ah,02h
mov dl,200
int 21h
gotoxy ff,cf ;mostrar el codo inferior der
mov ah,02h
mov dl,188
int 21h
endm
pactual macro
local repite
local repite1
mov cx,29
mov di,0
repite:
mov ruta[di],' '
inc di
loop repite
gotoxy 2,10
lea dx,ms1 ;Posiciono la direccion de la cadena
write ;escribe una cadena
mov ah,19h ;Me fijo en que Unidad estas
int 21h
push ax
mov bl,al
mov dl,unidad[BX] ;posiciono la direccion en la cadena, en la letra donde estoy
mov dir[0],dl
mov dir[1],':'
mov dir[2],'\'
pop ax
inc al
mov ah,47h ;Optener la carpta en que estoy
mov dl,al ;Unidad donde quiero conocer el directorio
lea si,ruta ;En ruta guarde el nombre de directorio en el que estoy
int 21h
mov cx,0
lea di,dir
add di,3
lea si,ruta
repite1:
mov al,[si]
mov [di],al
inc si
inc di
inc cx
cmp cx,29
jne repite1
mov dir[30],'$'
lea dx,dir
write
endm
;cuenta cuantos caracteres tiene una cadena
countc macro car,count
mov al,car
mov cx,count ;cuantas repeticiones
repne scasb ;compara la cadena con al
add cx,2
mov dh,0
mov dl,count
sub dx,cx
endm
.startup
repite:
clear ;limpia pantalla
;fi,ff,ci,cf
cuadro 1,24,0,79 ;dibuja cuadro
pactual ;posicion actual de url
gotoxy 10,10
lea dx,opc1
write
gotoxy 11,10
lea dx,opc2
write
gotoxy 12,10
lea dx,opc3
write
mov ah,08h
int 21h
cmp al,31h
je unida
cmp al,32h
je directorio
cmp al,13
jne repite
jmp salir
unida:
gotoxy 10,45
lea dx,ms2
write
mov ah,01h ;leo unidad
int 21h
sub al,30h
mov ah,0eh ;selecciona la unidad
mov dl,al
int 21h
jmp repite
directorio:
gotoxy 10,45
lea dx,ms3
write
lea di,dir
countc ' ',30
mov si,dx ;muevo a si el contador
repite3: ;concateno en dir la carpeta
mov ah,08h
int 21h
cmp al,13
je conti
mov ah,02h
mov dl,al
int 21h
mov dir[si],al
inc si
conti:
cmp al,13
jne repite3
inc si
mov dir[si],00h
mov ah,3bh ;cambia de directorio
lea dx,dir
int 21h
jmp repite
salir:
.exit
end
Este programa pide una cadena y dos caracteres, el primero es el carácter a buscar en la cadena y el segundo es el carácter a remplazar, con las instrucciones rep y scas se realiza la búsqueda si encuentra un carácter igual lo remplaza con stos.
;programa que pide una cadena y dos caracteres,en ella
;se realiza una busqueda con el primer caracter y al
;encontrar una ocurrencia lo remplaza por el segundo.
;utiliza las instrucciones stos y scas.
.model tiny
.data
cadena db 10 dup (' '),'$'
carb db 1
carr db 1
ms1 db 10,13,'Cadena => $'
ms2 db 10,13,'Caracter buscar => $'
ms3 db 10,13,'Caracter remplazar => $'
.code
mensaje macro
mov ah,09h ;mostramos la cadena
int 21h
endm
.startup
lea dx,ms1
mensaje
mov cx,10
lea di,cadena
repite:
mov ah,01h
int 21h ;lee un caracter
stosb ;pasa lo que ahy en al a la cadena
loop repite
lea dx,ms2
mensaje
mov ah,01h
int 21h ;lee el caracter a buscar
mov carb,al
lea dx,ms3
mensaje
mov ah,01h
int 21h ;lee el caracter a remplazar
mov carr,al
mov cx,10
lea di,cadena
repite1:
mov al,carb ;caracter a buscar
repne scasb ;repite si es distinto
dec di
mov al,carr ;caracter a remplazar
stosb ;lo cambia
cmp cx,0
jne repite1
lea dx,ms1
mensaje
mov ah,09h ;mostramos la cadena
lea dx,cadena
int 21h
.exit
end
Programa que le dos cadenas y usando las instrucciones stos y cmps compara las cadenas y determina si son iguales o no.
;programa que le dos cadenas con stos y las compara con cmps
;y dise si son iguales o no
;stos: almacena el contenido de los registros al, ax y eax
;en memoria (inc di)
;cmps: compara localidades de memoria de un byte, palabra o
;palabra doble
.model tiny
.data
cadena db 10 dup (' '),'$'
cad2 db 10 dup (' '),'$'
ms1 db 'Si son iguales$'
ms2 db 'No son iguales$'
.code
.startup
mov cx,10
lea di,cadena
repite:
mov ah,01h
int 21h
stosb
loop repite
mov cx,10
lea di,cad2
repite1:
mov ah,01h
int 21h
stosb
loop repite1
mov ax,ds ;muevo el segmento dato
mov es,ax ;al segmento extra
mov cx,10 ;cuantas repeticiones
lea di,cad2 ;cadena dos
lea si,cadena ;cadena uno
repe cmpsb ;compara las dos cadenas
je iguales
lea dx,ms2
jmp salir
iguales:
lea dx,ms1
salir:
mov ah,09h
int 21h
.exit
end
Programa que pide una cadena y un carácter, utilizando la instrucción scas y rep realizamos una búsqueda y contamos cuantas bese se repite el carácter en la cadena.
;programa que le una cadena y un caracter, y cuenta cuantas
;veses se repite el caracter
;scas(busqueda en cadenas): compara el contenido de al, ax o
;eax con el contenido de localidades de memoria (inc di)
.model tiny
.data
eti label byte
max db 20
count db ?
cadena db 20 dup (' '),'$'
.code
.startup
mov ah,0ah
lea dx,eti
int 21h
mov ah,01h
int 21h
mov bx,ds ;muevo el segmento dato
mov es,bx ;al segmento extra
mov ch,0
mov cl,count ;cuantas repeticiones
mov dl,0 ;contador del caracter
lea di,cadena ;cadena
repite:
repne scasb ;compara la cadena con al
inc dl ;incrementa el contador de car
cmp cx,0
jne repite
mov ah,02h
add dl,30h
int 21h
.exit
end
Programa que pide una cadena y con la instrucción movs copia la cadena a otra moviendo los caracteres directamente a direcciones de memoria.
;programa que mueve caracteres de una direccion de memoria
;a otra utilizanda la instruccion movs
;movs: mueve un byte, palabra o palabra doble desde una
;localidad en memoria a otra.
.model tiny
.data
eti label byte
max db 10
count db ?
cadena db 10 dup (' '),'$'
cad2 db 10 dup (' '),'$'
.code
.startup
mov ah,0ah
lea dx,eti
int 21h
mov ax,ds ;muevo el segmento dato
mov es,ax ;al segmento extra
mov cx,5 ;cuantas repeticiones
lea di,cad2 ;cadena destino
lea si,cadena ;cadena fuente
rep movsb ;mueve 5 caracteres
mov ah,09h
lea dx,cad2
int 21h
.exit
end
Este programa pide una cadena, y utilizando instrucciones para el manejo de cadenas (en este caso lods) la cadena original la voltea.
;programa que boltea una cadena utilizando la instruccion
;lodsb
;lods: carga desde memoria un byte, palabra o palabra doble
;en los registros al, ax, eax respectivamente (inc si)
.model tiny
.data
eti label byte
max db 10
count db ?
cadena db 10 dup (' '),'$'
cad2 db 10 dup (' '),'$'
.code
.startup
mov ah,0ah
lea dx,eti
int 21h
mov ax,ds ;muevo el segmento dato
mov es,ax ;al segmento extra
mov cx,10 ;cuantas repeticiones
lea di,cad2+9 ;cadena destino
lea si,cadena ;cadena fuente
repite:
lodsb ;pone en al un caracter
mov [di],al ;lo pasa a cad2
dec di ;resto 1 a cad2
loop repite
mov ah,09h
lea dx,cad2
int 21h
.exit
end
Este programa fue mi primer examen en el ensamblador, consta de 3 módulos, la primer parte era hacer un cuadro de toda la pantalla y pedir a usuario dos cadenas para concatenarlas y formar una sola, la segunda parte es que te pudieras desplazar entre la cadena concatenada y poderle cambiar el color de la letra de acuerdo a un menú mostrado y por ultimo era cambiar le el color del fondo también respecto a un menú. Esta un puco largo por que no lo optimic, el chiste es que salga en los examenes jejej.
;programa que pide dos cadenas y las concatena, tambien cambia el
;color de fondo y el color de la letra seleccionada
;elgame
.model tiny
.data
fila db 0
colu db 0
fini db 7
ffin db 18
cini db 12
cfin db 68
atri db 07h
ms1 db 'Cadena1 $'
ms2 db 'Cadena2 $'
men1 db '3.- azul 4.-verde 5.-cafe 6.- rojo$'
men2 db '7.- azul 8.-rojo 9.-azul-ver 0.- verde$'
con db 0
con1 db 0
cadena db 10 dup (' ')
cadena1 db 10 dup (' ')
cadena2 db 21 dup (' '),'$'
.code
clear macro
mov ah,00h ;limpia la pantalla
mov al,03h
int 10h
endm
gotoxy macro fil,col
mov ah,02h ;posiciona el cursor
mov dh,fil ;fila
mov dl,col ;columna
mov bh,0 ;pagina de video
int 10h
endm
leepos macro
mov ah,03h ;lee la posiscion del cursor
mov bh,0
int 10h
endm
leeatri macro
mov ah,08h ;lee el carac y atribu donde
mov bh,0h ;esta el cursor
int 10h
endm
escriatri macro
mov ah,09h ;escribe el carac y atribu
mov bh,0h ;donde esta el cursor
mov bl,atri
mov cx,1
int 10h
endm
cuadro macro fi,ff,ci,cf
local etiqueta
local etiqueta2
mov cl,ci
etiqueta: ;ciclo para mostrar la fila superior
gotoxy fi,cl ;fila superior
mov ah,02h ;inter. imprimir
mov dl,205 ;movemos a dl
int 21h
gotoxy ff,cl ;fila inferior
mov ah,02h
mov dl,205
int 21h
inc cl
cmp cl,cf
jne etiqueta ;ciclo aumenta + 1
mov cl,fi
etiqueta2:
gotoxy cl,ci ;columna izquierda
mov ah,02h
mov dl,186
int 21h
gotoxy cl,cf ;columna derecha
mov ah,02h
mov dl,186
int 21h
inc cl
cmp cl,ff
jne etiqueta2 ;ciclo aumenta + 1
gotoxy fi,ci ;mostrar el codo superior izq
mov ah,02h
mov dl,201
int 21h
gotoxy fi,cf ;mostrar el codo superior der
mov ah,02h
mov dl,187
int 21h
gotoxy ff,ci ;mostrar el codo inferior izq
mov ah,02h
mov dl,200
int 21h
gotoxy ff,cf ;mostrar el codo inferior der
mov ah,02h
mov dl,188
int 21h
endm
.startup
clear ;limpia pantalla
;fi,ff,ci,cf
cuadro 1,24,0,79 ;dibuja cuadro
gotoxy 2,2
mov ah,09h
lea dx,ms1
int 21h
mov si,0
lee:
mov ah,01h
int 21h
mov cadena[si],al
inc si
cmp si,10
jne lee
gotoxy 3,2
mov ah,09h
lea dx,ms1
int 21h
mov si,0
lee1:
mov ah,01h
int 21h
mov cadena1[si],al
inc si
cmp si,10
jne lee1
mov cx,0
lea di,cadena2
lea si,cadena
repite:
mov al,[si]
mov [di],al
inc si
inc di
inc cx
cmp cx,10
jne repite
mov cx,0
lea si,cadena1
repite1:
mov al,[si]
mov [di],al
inc si
inc di
inc cx
cmp cx,10
jne repite1
gotoxy 20,10
mov ah,09h
lea dx,men1
int 21h
gotoxy 21,10
mov ah,09h
lea dx,men2
int 21h
gotoxy 5,10
mov ah,09h
lea dx,cadena2
int 21h
gotoxy 5,10
mov colu,10
menu1:
mov ah,08h
int 21h
cmp al,31h
je izquierda
cmp al,32h
je derecha
cmp al,33h
je color1
cmp al,34h
je color2
cmp al,35h
je color3
cmp al,36h
je color4
cmp al,37h
je fondo1
cmp al,38h
je fondo2
cmp al,39h
je fondo3
cmp al,30h
je fondo4
cmp al,13
jne menu1
jmp salir
izquierda:
cmp colu,10
je menu1
dec colu ;decremento la columna
gotoxy 5,colu ;posiciono el cursor
jmp menu1
derecha:
cmp colu,29
je menu1
inc colu
gotoxy 5,colu ;posiciono el cursor
jmp menu1
color1: ;azul
leeatri ;lee el atributo
mov atri,01h
escriatri ;escribe el atributo
jmp menu1
color2: ;verde
leeatri ;lee el atributo
mov atri,02h
escriatri ;escribe el atributo
jmp menu1
color3: ;cafe
leeatri ;lee el atributo
mov atri,06h
escriatri ;escribe el atributo
jmp menu1
color4: ;rojo
leeatri ;lee el atributo
mov atri,04h
escriatri ;escribe el atributo
jmp menu1
fondo1: ;rojo
mov con,0
foon:
mov con1,0
foon1:
gotoxy con,con1
leeatri ;lee el atributo
mov atri,17h
escriatri ;escribe el atributo
inc con1
cmp con1,80
jne foon1
inc con
cmp con,24
jne foon
jmp menu1
fondo2: ;rojo
mov con,0
fooon:
mov con1,0
fooon1:
gotoxy con,con1
leeatri ;lee el atributo
mov atri,47h
escriatri ;escribe el atributo
inc con1
cmp con1,80
jne fooon1
inc con
cmp con,24
jne fooon
jmp menu1
fondo3: ;rojo
mov con,0
fonn:
mov con1,0
fonn1:
gotoxy con,con1
leeatri ;lee el atributo
mov atri,37h
escriatri ;escribe el atributo
inc con1
cmp con1,80
jne fonn1
inc con
cmp con,24
jne fonn
jmp menu1
fondo4: ;rojo
mov con,0
fon:
mov con1,0
fon1:
gotoxy con,con1
leeatri ;lee el atributo
mov atri,27h
escriatri ;escribe el atributo
inc con1
cmp con1,80
jne fon1
inc con
cmp con,24
jne fon
jmp menu1
izq:
cmp colu,5
je menu1
leeatri ;lee el atributo
mov al,' '
escriatri ;escribe el atributo
dec colu ;decremento la columna
gotoxy fila,colu ;posiciono el cursor
mov al,'*'
escriatri ;escribe el atributo
jmp menu1
salir:
.exit
end
Este programa permite mover un punto dentro de un cuadro o aria especificada, el pinto se puede mover hacia arriba, abajo, derecha e izquierda. Ilustra el manejo de pantalla con macros.
;programa que mueve un punto "*" en toda la pantalla
;la tecla 1 = mueve a la izquierda, 2 = a la derecha
;3 = mueve arriba y el 4 = mueve abajo
.model tiny
.data
fila db 0
colu db 0
fini db 7
ffin db 18
cini db 12
cfin db 68
con db 0
con1 db 0
.code
clear macro
mov ah,00h ;limpia la pantalla
mov al,03h
int 10h
endm
gotoxy macro fil,col
mov ah,02h ;posiciona el cursor
mov dh,fil ;fila
mov dl,col ;columna
mov bh,0 ;pagina de video
int 10h
endm
leepos macro
mov ah,03h ;lee la posiscion del cursor
mov bh,0
int 10h
endm
leeatri macro
mov ah,08h ;lee el carac y atribu donde
mov bh,0h ;esta el cursor
int 10h
endm
escriatri macro
mov ah,09h ;escribe el carac y atribu
mov bh,0h ;donde esta el cursor
mov bl,70h ;color de atributo
mov cx,1
int 10h
endm
cuadro macro fi,ff,ci,cf
local etiqueta
local etiqueta2
mov cl,ci
etiqueta: ;ciclo para mostrar la fila superior
gotoxy fi,cl ;fila superior
mov ah,02h ;inter. imprimir
mov dl,205 ;movemos a dl
int 21h
gotoxy ff,cl ;fila inferior
mov ah,02h
mov dl,205
int 21h
inc cl
cmp cl,cf
jne etiqueta ;ciclo aumenta + 1
mov cl,fi
etiqueta2:
gotoxy cl,ci ;columna izquierda
mov ah,02h
mov dl,186
int 21h
gotoxy cl,cf ;columna derecha
mov ah,02h
mov dl,186
int 21h
inc cl
cmp cl,ff
jne etiqueta2 ;ciclo aumenta + 1
gotoxy fi,ci ;mostrar el codo superior izq
mov ah,02h
mov dl,201
int 21h
gotoxy fi,cf ;mostrar el codo superior der
mov ah,02h
mov dl,187
int 21h
gotoxy ff,ci ;mostrar el codo inferior izq
mov ah,02h
mov dl,200
int 21h
gotoxy ff,cf ;mostrar el codo inferior der
mov ah,02h
mov dl,188
int 21h
endm
.startup
clear ;limpia pantalla
;fi,ff,ci,cf
cuadro 5,20,10,70 ;dibuja cuadro
cuadro fini,ffin,cini,cfin ;dibuja cuadro
mov con,8 ;pinta el cuadro
pinta:
mov con1,13
pinta1:
gotoxy con,con1
mov al,' '
escriatri
inc con1
cmp con1,68
jne pinta1
inc con
cmp con,18
jne pinta
inc fini
inc cini
mov al,fini
mov fila,al
mov al,cini
mov colu,al
gotoxy fini,cini ;posiciona
mov ah,02h
mov dl,'*'
int 21h
gotoxy fini,cini
repite:
mov ah,08h
int 21h
cmp al,49
je izquierda
cmp al,50
je derecha
cmp al,51
je arriba
cmp al,52
je abajo
cmp al,13
jne repite
jmp salir
izquierda:
cmp colu,13 ;columna inicio + 1
je repite
leeatri ;lee el atributo
mov al,' '
escriatri ;escribe el atributo
dec colu ;decremento la columna
gotoxy fila,colu ;posiciono el cursor
mov al,'*'
escriatri ;escribe el atributo
jmp repite
derecha:
cmp colu,67 ;columna fin - 1
je repite
leeatri ;lee el atributo
mov al,' '
escriatri ;escribe el atributo
inc colu ;incrementa la columna
gotoxy fila,colu ;posiciono el cursor
mov al,'*'
escriatri ;escribe el atributo
jmp repite
arriba:
cmp fila,8 ;fila inicio + 1
je repite
leeatri ;lee el atributo
mov al,' '
escriatri ;escribe el atributo
dec fila ;decremento la fila
gotoxy fila,colu ;posiciono el cursor
mov al,'*'
escriatri ;escribe el atributo
jmp repite
abajo:
cmp fila,17 ;fila fin - 1
je repite
leeatri ;lee el atributo
mov al,' '
escriatri ;escribe el atributo
inc fila ;incrementa la fila
gotoxy fila,colu ;posiciono el cursor
mov al,'*'
escriatri ;escribe el atributo
jmp repite
salir:
.exit
end
Programa dibuja un cuadro, puede ser de dos tipos con líneas dobles o con líneas simples, se utilizan procedimientos.
;programa que dibija un cuadro doble o simple, se utilizan 3
;procedimientos gotoxy, writec y porsupuesto cuadro
.model tiny
.stack
.data
car_f db 0
car_c db 0
car_is db 0
car_ii db 0
car_ds db 0
car_di db 0
.code
.startup
writec proto c, car:byte
gotoxy proto c, fil:byte, col:byte
cuadro proto c, fi:byte, ff:byte, ci:byte, cf:byte, tipo:byte
invoke cuadro, 5,20,5,20,'s'
.exit
writec proc c, car:byte ;escribe un caracter
mov ah,02h
mov dl,car
int 21h
ret
writec endp
gotoxy proc c, fil:byte, col:byte ;procedimiento con parametro
mov ah,02h ;posicionar el cursor
mov dh,fil ;fila
mov dl,col ;columna
mov bh,0 ;pagina de video
int 10h
ret
gotoxy endp
cuadro proc c, fi:byte, ff:byte, ci:byte, cf:byte, tipo:byte
cmp tipo,'d' ;comparo si el tipo es doble
je doble
jne simple
doble: ;caracteres para el cuadro doble
mov car_f,205
mov car_c,186
mov car_is,201
mov car_ii,200
mov car_ds,187
mov car_di,188
jmp continua
simple: ;caracteres oara el cuadro simple
mov car_f,196
mov car_c,179
mov car_is,218
mov car_ii,192
mov car_ds,191
mov car_di,217
continua:
mov cl,ci
etiqueta: ;ciclo para mostrar las filas supe y infe
invoke gotoxy, fi,cl
invoke writec, car_f
invoke gotoxy, ff,cl
invoke writec, car_f
inc cl
cmp cl,cf
jne etiqueta ;ciclo aumenta + 1
mov cl,fi
etiqueta2: ;mostrar las columnas izq y der
invoke gotoxy, cl,ci ;columna izquierda
invoke writec, car_c
invoke gotoxy, cl,cf ;columna derecha
invoke writec, car_c
inc cl
cmp cl,ff
jne etiqueta2 ;ciclo aumenta + 1
invoke gotoxy, fi,ci ;mostrar el codo superior izq
invoke writec, car_is
invoke gotoxy, fi,cf ;mostrar el codo superior der
invoke writec, car_ds
invoke gotoxy, ff,ci ;mostrar el codo inferior izq
invoke writec, car_ii
invoke gotoxy, ff,cf;mostrar el codo inferior der
invoke writec, car_di
ret
cuadro endp
end