restas macro p, s
mov al, p
sub al, s
add al, 30h
mov resta, al
mov ah, 09
lea dx, msj3
int 21h
mov ah, 02
mov dl, resta
int 21h
mov ah, 4ch
int 21h
endm
.model small
.stack 64
.data
n1 db 0
n2 db 0
resta db 0
msj db "Dame el primer valor: $"
msj2 db 10,13, "Dame el segundo valor $"
msj3 db 10,13, "resta = $"
.code
mov ax, @data
mov ds, ax
mov ah, 09
lea dx, msj
int 21h
mov ah, 01
int 21h
sub al, 30h
mov n1, al
mov ah, 09
lea dx, msj2
int 21h
mov ah, 01
int 21h
sub al, 30h
mov n2, al
restas n1, n2
ret
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Macro imprime
org 100h
inicio macro ; Declaramos la macro, le damos el nombre de inicio
mov ax,@data ; Cargamos el segmento de datos.
mov ds,ax
mov dx,ax
endm
imprime macro numero ;Nuestra segunda macro se llama imprime, nuestro parametro es numero
mov ah,02h
mov dl,numero ;Indica que mueva al registro DL lo que pasamos como parametro.
add dl,2Fh ;suma 2Fh para imprimir el numero real.
int 21h
endm
.data
mensaje db "Programa de macro que imprime del 9 al 0",13,10,"$"
mensaje2 db 13,10, "Loop que imprime del 0 al 9",13,10,"$"
num db 0 ;declaramos nuestra variable.
.code
mov cx,10
lea dx,mensaje
mov ah,09h
int 21h
inicio:
mov num,cl
imprime num ; Llamamos al macro con el valor de nuestra variable.
loop inicio ; Se repite el ciclo
lea dx,mensaje2
mov ah,09h
int 21h
MOV DL, "0"; Se transfiere la letra 0 al registro de datos en la parte baja del registro DX
MOV CX, 10; Se transfiere 10 al registro CX
PRINT_LOOP:; Se comenzara a imprimir hasta acabar las 26 interaciones
MOV AH, 02; Se transfiere 02 al acumulador de byte alto
INT 21h; Se efectua la interrupcion del dato ascii leido desde el teclado
INC DL; Siguiente caracter numerico
LOOP PRINT_LOOP; Continua hasta acabar las 10 vueltas
end
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Macro que realiza una suma:
sumas macro a, b ; Macro de la suma
mov al, a ; Se mueve el primer numero a al
add al, b ; A la parte baja del registro AX se le suma el segundo numero (b)
add al, 30h ; A la parte baja del registro AX se le suma 30h para obtener de nuevo el numero en decimal
mov suma, al ; Se mueve la parte baja del registro AX a suma
mov ah, 09 ; Salida de cadena de caracteres
lea dx, msj3 ; Se imprime el mensaje 3
int 21h ; Interrupcion
mov ah, 02 ; Peticion para colocar el cursor
mov dl, suma ; Se mueve suma a la parte baja del registro DX
int 21h ; Interrupcion
mov ah, 4ch ; Se termina el programa
int 21h ; Interrupcion
endm
.model small ;Modelo de memoria mas utilizado
.stack 64
.data ;segmento de datos con variables
n1 db 0
n2 db 0
suma db 0
msj db "Dame el primer valor: $"
msj2 db 10,13, "Dame el segundo valor $"
msj3 db 10,13, "suma = $"
.code ; Segmento de codigo
mov ax, @data ; Se mueve data a ax
mov ds, ax ; Movemos el registro AX a DS
mov ah, 09 ; Salida de una cadena de caracteres
lea dx, msj ; Se imprime el primer mensaje
int 21h ; Interrupcion
mov ah, 01 ; Peticion de leer caracter
int 21h ; Interrupcion
sub al, 30h ; Se resta 30h para obtener el numero
mov n1, al ; Se mueve al a n1
mov ah, 09 ; Salida de una cadena de caracteres
lea dx, msj2 ; Se imprime el segundo mensaje
int 21h ; Interrupcion
mov ah, 01 ; Peticion de leer caracter
int 21h ; Interrupcion
sub al, 30h ; Se resta 30h para obtener el numero
mov n2, al ; Se mueve al a n2
sumas n1, n2 ; Se llama al macro y se le envian los parametros
ret
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Programa que utiliza una macro para mostrar en pantalla si eres o no mayor de edad:
.model small ;modelo de memoria
.stack 64 ;segmento de pila
mmayor macro: ;declaracion de macro mmayor
MOV DX,OFFSET mens2;se lee la variable mens2
MOV AH,9
INT 21H;interupcion del DOS
endm;fin del macro
mmenor macro: ;declaracion de macro mmenor
MOV DX,OFFSET mens3se lee la variable mens3
MOV AH,9;trabaja con la interrupcion
INT 21H;interrupcion del DOS
endm;fin del macro
finn macro:;declaracion de macro fin
mov ah,4ch;sentencia para terminar el programa
int 21h;interrupcion del DOS
endm;fin del macro
;============================empieza segmento datos
.data
num1 db 0 ;variable para almacenar la edad
diez db 10 ;variable para poder imprimir 2 caracteres(se multiplica por el primer numero ingresado,para ser decenas)
mens db "ingresa tu edad ","$" ;mensaje inicial
mens2 db 13,10,"Eres mayor de edad","$" ; Mensaje para mayor de edad
mens3 db 13,10,"Eres menor de edad","$" ; Mensaje para menor de edad
;===================================================termina segmento datos
;=================inicia segmento codigo
.code
inicio proc far
mov ax,@data;direccionamos el segmento de datos
mov ds,ax ;los datos se mueven a ax
mov ah,09;trabaja con la interrupcion
lea dx, mens;se lee la variable mens
int 21h ;interrupcion del DOS
mov ah,01;;espera la entrada del teclado
int 21h ;interrupcion de DOS
sub al,30h;se le restan 30 para convertir a numero
mul diez;se multiplica el numero ingresado para convertirlo a decenas
mov num1,al;el resultado se mueve al registro al
mov ah,01;se espera entrada del teclado
int 21h;interrupcion del DOS
sub al,30h;se tranforma a numero el segundo digito ingresado
add num1,al ;se suma a las decenas obtenidas
mov al,num1;se mueva a al el resultado de la suma
cmp al,18;se compara si el contenidos de al es 18
jge mayor;en caso de ser mayor se salta al proceso mayor
;=========== de no cumplirse(sea menor a 18)el programa continua a este segmento
mov ah,09 ;trabaja con la interrupcion
lea dx,mens3; Se lee la variable mens3
int 21h; Interrupcion del DOS
jmp fin; Y salta a proceso fin
;====================procesos
mayor:;se declara el proceso mayor
mmayor; El proceso llama a la MACRO mmayor
fin:;se declara el proceso fin
finn;el prceso llama al MACRO finn
inicio endp ;se termina a inicio
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Macro con archivo TXT
include 'macros.txt'
data segment
var dw 6
ends
main proc
mov bx,1
mov ax,1
m_suma bx
m_final
end main
Contenido del archivo .txt
m_final macro
mov ah, 4ch
int 21h
endm
m_suma macro var
add ax, bx
endm
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Macro que se manda a llamar con diferentes archivos de texto TXT
MyMacro MACRO p1, p2, p3
MOV AX, p1
MOV BX, p2
MOV CX, p3
ENDM
ORG 100h
include 'MyMacro1.txt'
include 'MyMacro2.txt'
ret
PRIMER ARCHIVO DE TEXTO: MyMacro1.txt
MyMacro 1, 2, 3
SEGUNDO ARCHIVO DE TEXTO: MyMacro2.txt
MyMacro 4, 5, DX
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Programa que imprime números a partir de macros
imprime macro numero ;Nuestra macro se llama imprimir, nuestro parámetro es numero
mov ah,02h
mov dl,numero ;Indica que mueva al registro DL lo que pasamos como parámetro.
add dl,30h ;suma 30h para imprimir el número real.
int 21h
endm
lup macro
mov num,cl
imprime num ;Llamamos al macro con el valor de nuestra variable.
loop inicio ;repite ciclo
endm
Fin macro
mov ah,04ch ;Finaliza el programa.
int 21h
endm
.model small
.stack 64
.data
num db 0 ;declaramos nuestra variable.
.code
mov cx,9
inicio:
lup
Fin
end
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Programa que utiliza macros para mostrar mensaje de buenos días
FIN MACRO MOV AH, 4CH ;TERMINACION DEL PROGRAMA INT 21H ENDM ;--------------------------------------------------- PILA SEGMENT PARA STACK "STACK" DB 200 DUP (0) ;ESPACIO DE LAS INSTRUCCIONES PILA ENDS ;--------------------------------------------------- DATOS SEGMENT PARA "DATA" ;DATOS A INGRESAR VA DB "DESPUES DE MEDIO DIA (Y/N): ","$" ;SELECCION DE INICIO DEL PROGRAMA VD DB 13,10," BUENOS DIAS","$" ;MENSAJES MOSTRADOS EN PANTALLA VT DB 13,10," BUENAS TARDES","$" ;MENSAJES MOSTRADOS EN PANTALLA DATOS ENDS ;--------------------------------------------------- CODIGO SEGMENT PARA "CODE" EMPIEZA PROC FAR ASSUME CS: CODIGO, DS: DATOS, SS: PILA MOV AX, DATOS ;MANDAR LLAMAR A DATOS MOV DS, AX MOV AH, 0FH INT 10H MOV AH, 00H INT 10H MOV DX,OFFSET VA ;IMPRIMIR MENSAJE "DESPUES DE MEDIO DIA" MOV AH,9 INT 21H CALL PREGUNTA EMPIEZA ENDP PREGUNTA PROC NEAR ;Inicia el MOV AH, 01H ;ESPERA UNA ACCION INT 21H CMP AL, "Y" ;Asignar una accion a una tecla JZ TARDES CMP AL, "N" ;Asignar una accion a una tecla JZ DIAS CMP AL, "y" ;Asignar una accion a una tecla JZ TARDES CMP AL, "n" ;Asignar una accion a una tecla JZ DIAS TARDES: MOV DX, OFFSET VT ;IMPRIMIR MENSAJE "BUENOS TARDES" MOV AH, 09 INT 21H FIN DIAS: MOV DX, OFFSET VD ;IMPRIMIR MENSAJE "BUENOS DIAS" MOV AH, 09 INT 21H FIN RET PREGUNTA ENDP ;FIN DE PREGUNTA PROC CODIGO ENDS END EMPIEZA
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Hacer programa que realice una multiplicación
.model small
.stack
.data ;definición de datos(variables), donde se almacenara información
.code
chr1 db ? ;primer digito
chr2 db ? ;segundo digito
chr3 db ? ;multiplo
chr4 db ?
r1 db ? ;resultado 1
r2 db ? ;resultado 2
r3 db ?
r4 db ?
ac db 0 ;acarreo
ac1 db 0
.startup
;cls
operacion macro a, b, c, d ;creacion de macro operacion con 4 parametros
mov al,a ;unidad del segundo numero
mov bl,b ;unidad del primer numero
mul bl ;multiplicar
mov ah,0 ;limpiamos ah0
aam ;separamos de hex a dec
mov ac1,ah ;decenas del primera multiplicacion
mov r4,al ;unidades del primera multiplicacion
mov al,a ;unidades del segundo numero
mov bl,d ;decentas del primer numero
mul bl ;multiplicar
mov r3,al ;movemos el resultado de la operacion a r3
mov bl,ac1 ;movemos el acarreo a bl
add r3,bl ;sumamos resultado mas acarreo
mov ah,00h ;limpiamos ah por residuos
mov al,r3 ;movemos el resultado de la suma a al
aam ;separamos de hex a dec
mov r3,al ;guardamos unidades en r3
mov ac1,ah ;guardamos decenas en ac1
mov al,c ;al = chr3
mov bl,b ;bl = chr2
mul bl ;AL = chr3*chr2 (BL*AL)
mov Ah,0h ;
AAM ;ASCII Adjusment
mov ac,AH ;ac = AH (Acarreo)
mov r2,AL ;r2 = AL (Unidad del resultado)
mov al,c ;AL = chr3
mov bl,d ;BL = chr1
mul bl ;AL = chr1*chr3 (BL*AL)
mov r1,al ;r1 = AL (Decena del resultado)
mov bl,ac ;BL = Acarreo anterior
add r1,bl ;r1 = r1+ac (r1 + Acarreo)
mov ah,00h ;
mov al,r1 ;AL = r1 (Asignaci?n para el ajust)
AAM ;ASCII Adjustment
mov r1,al ;r1 = AL
mov ac,ah ;ac = AH (Acarreo para la Centena del resultado)
endm
;suma final
;R4 resulta ser las unidades de mul y no se toma en cuenta ya que se pasa entero
suma macro respuesta3,respuesta2,respuesta1,acomulador ;creacion de macro suma con 4 parametros
mov ax,0000h ;limpiamos ax
mov al,respuesta3 ;movemos el segundo resultado de la primera mult a al
mov bl,respuesta2 ;movemos primer resultado de la segunda mult a bl
add al,bl ;sumamos
mov ah,00h ;limpiamos ah
aam ;separamos hex a dec
mov respuesta3,al ;r3 guarda las decenas del resultado final
mov respuesta2,ah ;r2 se utiliza como nuevo acarreo
mov ax,0000h ;''''
mov al,acomulador ;movemos el acarreo de la primera mult a al
mov bl,respuesta1 ;movemos segundo resultado de la segunda mult a bl
add al,respuesta2 ;sumamos el nuevo acarreo de la suma anterior a al
add al,bl ;sumamos al a bl
mov ah,00h ;limpiamos el registro ah
aam ;separamos de hex a dec
mov respuesta1,al ;r1 guarda las centenas
mov respuesta2,ah ;ah se sigue utilizando como acarreo
mov al,respuesta2 ;movemos el acarreo a al
mov bl,ac ;movemos ac a bl
add al,bl ;sumamos al a bl
;aam ;separamos hex a dec
mov ac,al ;mov al a ac como nuestro acarreo final
endm
mov ah,00h ;Function(Set video mode)
mov al,03 ;Mode 80x25 8x8 16
int 10h ;Interruption Video
mov ah,01h ;Function(character read) Guarda en AL
int 21h ;Interruption DOS functions
sub al,30h ;ajustamos valores
mov chr1,al ;[chr1].chr2 * chr3 = ac.r1.r2
mov ah,01h ;Function(character read) Guarda en AL
int 21h ;Interruption DOS functions
sub al,30h ;Ajustamos valores
mov chr2,al ;chr1.[chr2] * chr3 = ac.r1.r2
mov ah,02h ;Function(character to send to standard output)
mov dl,'*' ;Character to show
int 21h
mov ah,01h ;Function(Read character) Guarda en AL
int 21h ;Interruption DOS Functions
sub al,30h ;Transform(0dec = 30hex)
mov chr3,al ;chr1.chr2 * [chr3] = ac.r1.r2
mov ah,01h ;Function(Read character) Guarda en AL
int 21h ;Interruption DOS Functions
sub al,30h ;Transform(0dec = 30hex)
mov chr4,al ;chr1.chr2 * [chr3] = ac.r1.r2
mov ah,02h ;Character to send to standar output
mov dl,'=' ;
int 21h ;Interruption DOS functions
;Realizamos operacion
operacion chr4,chr2,chr3,chr1 ;llamada al macro con parametros
suma r3,r2,r1,ac1 ;llamada al macro con parametros
mov ah,02h
mov dl,ac
add dl,30h
int 21h ;Mostramos ac (millar)
mov ah,02H
mov dl,r1
add dl,30h
int 21h ;Mostramos r1 (centena)
mov ah,02H
mov dl,r3
add dl,30h
int 21h ;Mostramos r3 (decena)
mov ah,02H
mov dl,r4
add dl,30h
int 21h ;unidad
.exit
end
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Macro del segmento de datos
inicio macro ;declaramos la macro, le damos el nombre de inicio
mov ax,data ;Cargamos el segmento de datos.
mov ds,ax
mov dx,ax
endm
.model small
.stack 64
.data
msj db "Este es mi primer macro",10,13,"$"
.code
inicio ;Llamamos al macro, lo unico que hace es cargar msj del segmento de datos.
mov ah,09h
lea dx,msj ;puede ser mov dx,offset msj
int 21h ;interrupcion
mov ax,4c00h ;Sale del programa
int 21h ;interrupcion
end
No hay comentarios.:
Publicar un comentario