Programa 1:
FIN MACRO
MOV AH, 4CH
INT 21H
ENDM
;---------------------------------------------------
PILA SEGMENT PARA STACK "STACK"
DB 200 DUP (0)
PILA ENDS
;---------------------------------------------------
DATOS SEGMENT PARA "DATA"
VA DB "DESPUES DE MEDIO DIA (Y/N): ","$"
VD DB 13,10," BUENOS DIAS","$"
VT DB 13,10," BUENAS TARDES","$"
DATOS ENDS
;---------------------------------------------------
CODIGO SEGMENT PARA "CODE"
EMPIEZA PROC FAR
ASSUME CS: CODIGO, DS: DATOS, SS: PILA
MOV AX, DATOS
MOV DS, AX
MOV AH, 0FH
INT 10H
MOV AH, 00H
INT 10H
MOV DX,OFFSET VA
MOV AH,9
INT 21H
CALL PREGUNTA
EMPIEZA ENDP
PREGUNTA PROC NEAR
MOV AH, 01H
INT 21H
CMP AL, "Y"
JZ TARDES
CMP AL, "N"
JZ DIAS
CMP AL, "y"
JZ TARDES
CMP AL, "n"
JZ DIAS
TARDES:
MOV DX, OFFSET VT
MOV AH, 09
INT 21H
FIN
DIAS:
MOV DX, OFFSET VD
MOV AH, 09
INT 21H
FIN
RET
PREGUNTA ENDP
CODIGO ENDS
END EMPIEZA
Programa 2:
INICIO MACRO ; Define macro MOV AX, DATA ; cuerpo de MOV DS, AX ; la definición MOV ES, AX ; de la macro ENDM
ejemplo de procedimientos:
SUM2DW_P.ASM ;
; Este programa suma dos variables de tipo palabra doble ; y guarda el resultado en una variable de tipo palabra ; doble. Este programa utiliza un procedimiento para ; efectuar la suma. ; ; El pseudocódigo de este programa es: ;
; DX:AX = dato1 ; CX:BX = dato2 ; ; suma2dw() ; ; resul = DX:AX ;********************************************************** ;****** CÓDIGO DE INICIO **********************************
ideal dosseg model small stack 256 ;****** VARIABLES DEL PROGRAMA ****************************
dataseg codsal db 0 dato1 dd ? dato2 dd ? resul dd ? ;******
CÓDIGO DEL PROGRAMA *******************************
codeseg inicio: mov ax, @data ; Inicializa el mov ds, ax ; segmento de datos mov ax, [word dato1] ; DX:AX = dato1 mov dx, [word dato1+2] mov bx, [word dato2] ; CX:BX = dato2 mov cx, [word dato2+2]
; Llama al procedimiento para efectuar la suma
call suma2dw ; suma2dw()
mov [word resul], ax ; resul = DX:AX
mov [word resul+2], dx
salir:
mov ah, 04Ch
mov al, [codsal]
int 21h
;****** PROCEDIMIENTOS ************************************
;**********************************************************
; SUMA2DW
;
; Este procedimiento suma dos variables de tipo
; palabra doble.
;
; Parámetros:
;
; DX:AX = Primer sumando
; CX:BX = Segundo sumando
;
; Regresa:
;
; DX:AX = Suma
;
; El pseudocódigo de este procedimiento es:
;
; DX:AX += CX:BX
;**********************************************************
proc suma2dw
add ax, bx ; DX:AX += CX:BX
adc dx, cx
ret ; Regresa del
; procedimiento
endp suma2dw
;****** CÓDIGO DE TERMINACIÓN *****************************
end inicio
; Llama al procedimiento para efectuar la suma
call suma2dw ; suma2dw()
mov [word resul], ax ; resul = DX:AX
mov [word resul+2], dx
salir:
mov ah, 04Ch
mov al, [codsal]
int 21h
;****** PROCEDIMIENTOS ************************************
;**********************************************************
; SUMA2DW
;
; Este procedimiento suma dos variables de tipo
; palabra doble.
;
; Parámetros:
;
; DX:AX = Primer sumando
; CX:BX = Segundo sumando
;
; Regresa:
;
; DX:AX = Suma
;
; El pseudocódigo de este procedimiento es:
;
; DX:AX += CX:BX
;**********************************************************
proc suma2dw
add ax, bx ; DX:AX += CX:BX
adc dx, cx
ret ; Regresa del
; procedimiento
endp suma2dw
;****** CÓDIGO DE TERMINACIÓN *****************************
end inicio
La principal
diferencia entre una macro y un procedimiento es que en la macro se hace
posible el paso de parámetros y en el procedimiento no (esto es aplicable solo
para el MASM, hay otros lenguajes de Programación que si lo permiten). Al
momento de ejecutarse la macro cada parámetro es sustituido por el nombre o
valor especificado al momento de llamarla.
Podemos decir
entonces que un procedimiento es una extensión de un determinado programa,
mientras que la macro es un módulo con funciones específicas que puede ser
utilizado por diferentes programas.
Otra diferencia
entre una macro y un procedimiento es la forma de llamar a cada uno, para
llamar a un procedimiento se requiere el uso de una directiva, en cambio la
llamada a las macros se realiza como si se tratara de una instrucción del
ensamblador.
gracias por tu aporte
ResponderEliminar