lunes, 11 de noviembre de 2013

procedimientos y macros

ejemplos de macros:
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

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. 

1 comentario: