Logo Studenta

assemblyMethods

Esta es una vista previa del archivo. Inicie sesión para ver el archivo original

cursor macro page,row,column ;posicionamos el cursor
 mov ah,02
 mov bh,page
 mov dh,row
 mov dl,column
 int 10h
endm
 
visibleInput macro ;entradas de valores
 mov ah,01
 int 21h
endm
notVisibleInput macro ;entradas de valores pero sin mostrarlos
 mov ah,07
 int 21h 
endm 
defineSize macro size,source ;definimos la cantidad de elementos de un array 
 mov cx,size
 mov si,source
endm
 
addValues macro ;llenamos el array
 mov array[si],al 
 inc si
endm
printText macro msg ;imprimir cadenas
 mov ah,09
 lea dx,msg 
 int 21h 
endm 
next macro nxt ;salto de linea
 mov ah,09
 lea dx,nxt
 int 21h 
endm
oneDigitAddition macro msg1,msg2,msg3		;suma de un digito con resultado de dos digitos
 	printText msg1
 	visibleInput
 	
 	sub al,30h
 	mov bl,al
 	
 	printText msg2
 	visibleInput 
 	
 	sub al,30h
 	add al,bl
 	
	;ajuste para la suma
 	aaa
 	or ax,3030h
 	mov bx,ax
 	sub bh,01h
 	
 	printText msg3
 	
 	;impresion parte alta
 	mov ah,02h
 	mov dl,bh
 	int 21h
 	
 	;impresion parte baja
 	mov ah,02
 	mov dl,bl
	int 21h
endm
 
twoDigitsAddition macro msg1,msg2,msg3		;suma de dos digitos con resultado de tres digitos
 printText msg1
 visibleInput
 
 sub al,30h
 mov bl,al 
 
 visibleInput
 sub al,30h 
	 mov cl,al
 
 ;ingresa segundo numero
 printText msg2
 visibleInput
 
	 sub al,30h 
 add bl,al 
 
 visibleInput
 
	 sub al,30h
 add cl,al
 
 printText msg3
 
 mov ax,cx
 
 aam
 mov cx,ax
 
 add bl,ch
 mov ax,bx
 
 aam
 mov bx,ax
 
 mov ah,02h
 mov dl,bh
 add dl,30h
 int 21h
 
 mov ah,02h
 mov dl,bl
 add dl,30h
 int 21h 
 
 mov ah,02h
 mov dl,cl
 add dl,30h
 int 21h
endm
randomNumbers macro n		;numeros aleatorios del 0 al 9
 mov ah,2ch
 int 21h 
 xor ax, ax
 mov dh, 00h
 add ax, dx
 aaa
 add ax, 3030h
 mov n, al
 lea dx, n
 mov ah, 09h
 int 21h
endm
dateAndHour macro				;fecha y hora actual del sistema operativo
;GUARDAMOS VARIABLES EN HEXADECIMAL
;Servivio Hora
mov ah, 2Ch
int 21h
mov offset horas, ch
mov offset minutos, cl
mov offset segundos, dh
;servicio Fecha
mov ah, 2Ah
int 21h
mov offset dia_semana, al
mov offset anio, cx
mov offset mes, dh
mov offset dia_mes, dl
jmp Mostrar_Dia_Semana
;RUTINAS
Mostrar_Dia_Semana:
;Obtener el numero del dia de la semana y guardarlo en CX
mov cl, [dia_semana]
mov ch, 0
;Obtener la direccion de memoria del vector de dias
;Y le sumamos el dia de la semana multiplicado por 10
;Para obtener la direccion exacta del dia en el vector
mov bx, offset msj_dia_semana
mov ax, cx
mov cl, 0Ah
mul cx
add bx, ax
mov ah, 09
mov dx, bx
int 21h 
Mostrar_Dia:
;Obtener el numero del dia del mes
;Dividimos entre 10 para obtener el numero en decimal
;Luego lo transformamos a ASCII
mov al, [dia_mes]
mov cl, 10
mov ah, 0
div cl
or ax, 3030h
mov bx, offset dia_mes_conv
mov [bx], al
inc bx
mov [bx], ah
mov ah, 09
mov dx, offset dia_mes_conv
int 21h 
Mostrar_Mes:
;Obtener el numero del mes, y guardarlo en CX
mov cl, [mes] 
add cl, 2
mov ch, 0
;Obtener la direccion de memoria del vector de mes
;Y le sumamos el numero del mes multiplicado por 12
;Para obtener la direccion exacta del mes
mov bx, offset msj_mes
mov ax, cx
mov cl, 08h
mul cx
add bx, ax
sub bx, 08h
mov ah, 09
mov dx, bx
int 21h 
Mostrar_Anio:
;Obtener el numero del anio actual
;AL = 201 | AH = 1
;Hay que ir dividiendo entre 10 el registro AL para ir guardando
;digito por digito y asi guardarlo en variables separadas
;para que posteriormente se le pueda hacer un OR 3030h y obtener el ASCII
mov bx, offset anio
mov ax, [bx]
mov cl, 10
div cl
mov dig1, ah
mov ah, 0
mov cl, 10
div cl
mov dig2, ah
mov ah, 0
mov cl, 10
div cl
mov dig3, ah
mov ah, 0
mov cl, 10
div cl
mov dig4, ah
or dig4, 30h
or dig3, 30h
or dig2, 30h
or dig1, 30h
;Imprimimos el anio numero por numero
mov ah, 09
mov dx, offset dig4
int 21h
mov dx, offset dig3
int 21h
mov dx, offset dig2
int 21h
mov dx, offset dig1
int 21h
mov dx, offset salto_linea
int 21h
jmp Mostrar_Hora 
Mostrar_Hora:
;Obtener el numero de la hora
;Comparamos si es mayor o igual a 12 para cambiar formato
mov ah, 09
mov dx, offset msj_hora
int 21h
mov al, [horas]
cmp al, 0Ch
jae cambia_formato
formato_normal:
mov tipo_formato, 0 ;El formato es "AM"
mov cl, 10
mov ah, 0
div cl
or ax, 3030h
mov bx, offset horas_conv
mov [bx], al
inc bx
mov [bx], ah
mov ah, 09
mov dx, offset horas_conv
int 21h
Mostrar_minutos:
;Obtener el numero de minutos
;Hacer lo mismo que con el dia del mes
mov ah, 09
mov dx, offset msj_separador
int 21h
mov al, [minutos]
mov cl, 10
mov ah, 0
div cl
or ax, 3030h
mov bx, offset min_conv
mov [bx], al
inc bx
mov [bx], ah
mov ah, 09
mov dx, offset min_conv
int 21h
Mostrar_segundos:
;Obtener el numero de segundos
;Hacer lo mismo que con minutos
mov ah, 09
mov dx, offset msj_separador
int 21h
mov al, [segundos]
mov cl, 10
mov ah, 0
div cl
or ax, 3030h
mov bx, offset seg_conv
mov [bx], al
inc bx
mov [bx], ah
mov ah, 09
mov dx, offset seg_conv
int 21h
mov bx, offset tipo_formato
add bl, formato
mov dx, bx
int 21h 
mov ah, 4ch
int 21h
cambia_formato:
sub al, 0Ch
mov formato, 4 ;El formato es "PM"
jmp formato_normal
;****************************** FIN *************************
;Variables para guardar los valores en hexadecimal
horas DB ?, '$'
minutos DB ?, '$'
segundos DB ?, '$'
dia_semana DB ?, '$'
dia_mes DB ?, '$'
mes DB ?, '$'
anio DB ?, ?, '$'
formato DB ?
;Variables convertidas a ASCII
dia_mes_conv DB ?, ?, " de ", '$'
anio_conv DB ?, ?, '$'
horas_conv DB ?, ?, '$'
min_conv DB ?, ?, '$'
seg_conv DB ?, ?, '$'
dig1 DB ?, '$'
dig2 DB ?, '$'
dig3 DB ?, '$'
dig4 DB ?, '$'
;Variables que contienen cadena de caracteres
;msj_dia_semana = 10 caracteres por casilla
;msj_dia_semana = 11 caracteres por casilla
msj_hora DB "Hora: ",'$'
msj_separador DB " :",'$'
msj_dia_semana DB "Domingo $","Lunes $","Martes $","Miercoles$","Jueves $","Viernes $","Sabado $"
msj_mes DB "Enero del $","Febrero del $","Marzo del $","Abril del $","Mayo del $","Junio del $","Julio del $", "Agosto del $","Septiembre del $","Octubre del $","Noviembre del $","Diciembre del $"
tipo_formato DB " am$", " pm$"
salto_linea DB 0Ah, 0Dh,'$'
endm 
diagonal macro		;dibujar una diagonal con colores
 mov cx,1 
 mov al,13h
 
 mov ah,0
 int 10h	;establece los graficos del modo de video 
 bucle1:
 mov dx,cx 
 mov al,color	;AL=color de los pixeles
 mov ah,0ch		;cambiar el color para un solo pixel
 int 10h		;establecer pixel
 cmp cx, 101		;llegar hasta 100 x 100 (va en diagonal)
 jz fin 
 inc cx		;DX=fila.
 add color,2		;para cambiar colores 
 jmp bucle1		;CX=column
 
 fin:
 ret
 color db 1
endm
clr macro ;limpiar pantalla
 mov ah,06h 
 mov al,00h 
 mov bh,07h 
 mov cx,00h
 mov dh,25h
 mov dl,80h 
 int 10h 
endm 
emptyAll macro		;vaciamos registros
 mov ax,0000h
mov bx,0000h
 mov cx,0000h
 mov dx,0000h
endm
emptyAX macro		;vaciamos registros
 mov ax,0000h
endm
emptyBX macro		;vaciamos registros
 mov bx,0000h
endm
emptyCX macro		;vaciamos registros
 mov cx,0000h
endm
emptyDX macro		;vaciamos registros
 mov dx,0000h
endm
endProgram macro ;terminar programa
 mov ah,4ch 
 int 21h
endm

Más contenidos de este tema