La diferencia entre un procedimiento y un macro, es que los procedimientos leen línea por línea el código, y los macros no, los procedimientos usan la sentencia call para ser llamados en caso de que no esten implícitos en el código, y los macros utilizan la sentencia include cuando son externos al programas, tomando un conjunto de instrucciones que ya estan definidas y solo se ejecutan tal y como estan.
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
;**********************************************************
; SWAPNIBL2.ASM
;
; Este programa intercambia los MSN y LSN de
una variable
; de un byte. El resultado queda en la misma
variable.
; Este programa utiliza un procedimiento para
intercambiar
; los nibles.
;
; El pseudocódigo de este programa es:
;
; AL = dato
; swapnibl()
; dato = AL
;**********************************************************
;****** CÓDIGO DE INICIO **********************************
ideal
dosseg
model small
stack 256
;****** VARIABLES DEL PROGRAMA
****************************
dataseg
codsal db 0
dato db ?
;****** CÓDIGO DEL PROGRAMA
*******************************
codeseg
inicio:
mov ax, @data ; Inicializa el
mov ds, ax ; segmento de datos
mov al, [dato] ; AL = dato
; Llama al procedimiento para intercambiar
los nibles
call swapnibl ; swapnibl()
mov [dato], al ; dato = AL
salir:
mov ah, 04Ch
mov al, [codsal]
int 21h
;****** PROCEDIMIENTOS
************************************
;**********************************************************
; SWAPNIBL
;
; Este procedimiento intercambia los MSN y
LSN de una
; variable de un byte.
;
; Parámetro:
;
; AL = dato
;
; Regresa:
;
; AL = dato con los nibles intercambiados.
;
; El pseudocódigo de este procedimiento es:
;
; CL = 4
; rol al, 4
;**********************************************************
proc swapnibl
push cx ; Preserva CX
mov cl, 4
rol al, cl
pop cx ; Recupera CX
ret
endp swapnibl
;****** CÓDIGO DE TERMINACIÓN
*****************************
end inicio
MACROS
;Programa que muestra un marco desde la coordenada
(Fila1,Columna1) hasta la (Fila2,Columna2)
;El programa, utiliza macros. funciona con LOOP. y utiliza la función 02h de la interreucipon 21h
;02:15 p.m. Miercoles, 18 de Octubre de 2006
MARCO MACRO FILA1, COL1, FILA2, COL2
LOCAL LINE_TOP
LOCAL EXIT_TOP
LOCAL LINE_BOTTOM
LOCAL EXIT_BOTTOM
LOCAL LINE_LEFT
LOCAL EXIT_LEFT
LOCAL LINE_RIGHT
LOCAL EXIT_RIGHT
;Recorremos desde COL2 hasta COL1 en FILA1
MOV cl,COL2 ;El contador decrementará desde COL2
LINE_TOP: ;
MOV AH,02h ;Set cursor position (Int 10/02)
MOV DH,fila1 ;Row
MOV DL,cl ;Column
MOV BH,0 ;page number: 0 = in graphics modes
int 10h ;Video (Int 10)
MOV AH,02h ;Write attributes/characters at cursor position (Int 10/09)
MOV DL,'+' ;Character
INT 21H ;
CMP Cl,COL1
je EXIT_TOP
LOOP LINE_TOP ;dec cx;cmp cx,0;jne line_left;
EXIT_TOP:
;Recorremos desde COL2 hasta COL1 en FILA2
MOV cl,col2
LINE_BOTTOM:
MOV AH,02h ;Set cursor position (Int 10/02)
MOV DH,fila2 ;Row
MOV DL,cl ;Column
MOV BH,0 ;page number: 0 = in graphics modes
int 10h ;Video (Int 10)
MOV AH,02h ;Write characters only at cursor position (Int 10/0A)
MOV DL,'+' ;Character
INT 21H
CMP Cl,COL1
je EXIT_BOTTOM
LOOP LINE_BOTTOM ;dec cx;cmp cx,0;jne line_left;
EXIT_BOTTOM:
;Recorremos desde FILA2 hasta FILA1 en COL1
MOV cl,FILA2
LINE_LEFT:
MOV AH,02h ;Set cursor position (Int 10/02)
MOV DH,cl ;Row
MOV DL,COL1 ;Column
MOV BH,0 ;page number: 0 = in graphics modes
int 10h ;Video (Int 10)
MOV AH,02h ;Write characters only at cursor position (Int 10/0A)
MOV DL,'+' ;Character
INT 21H
CMP Cl,FILA1
je EXIT_LEFT
LOOP LINE_LEFT ;dec cx;cmp cx,0;jne line_left;
EXIT_LEFT:
;Recorremos desde FILA2 hasta FILA1 en COL2
MOV cl,FILA2
LINE_RIGHT:
MOV AH,02h ;Set cursor position (Int 10/02)
MOV DH,cl ;Row
MOV DL,COL2 ;Column
MOV BH,0 ;page number: 0 = in graphics modes
int 10h ;Video (Int 10)
MOV AH,02h ;Write characters only at cursor position (Int 10/0A)
MOV DL,'+' ;Character
INT 21H
CMP Cl,FILA1
je EXIT_RIGHT
LOOP LINE_RIGHT ;dec cx;cmp cx,0;jne line_left;
EXIT_RIGHT:
;Dibujamos esquinas
MOV AH,02h ;Set cursor position (Int 10/02)
MOV DH,FILA1 ;Row
MOV DL,COL1 ;Column
MOV BH,0 ;page number: 0 = in graphics modes
int 10h ;Video (Int 10)
MOV AH,02h ;Write characters only at cursor position (Int 10/0A)
MOV DL,'@' ;Character
INT 21H
MOV AH,02h ;Set cursor position (Int 10/02)
MOV DH,FILA1 ;Row
MOV DL,COL2 ;Column
MOV BH,0 ;page number: 0 = in graphics modes
int 10h ;Video (Int 10)
MOV AH,02h ;Write characters only at cursor position (Int 10/0A)
MOV DL,'@' ;Character
INT 21H
MOV AH,02h ;Set cursor position (Int 10/02)
MOV DH,FILA2 ;Row
MOV DL,COL1 ;Column
MOV BH,0 ;page number: 0 = in graphics modes
int 10h ;Video (Int 10)
MOV AH,02h ;Write characters only at cursor position (Int 10/0A)
MOV DL,'@' ;Character
INT 21H
MOV AH,02h ;Set cursor position (Int 10/02)
MOV DH,FILA2 ;Row
MOV DL,COL2 ;Column
MOV BH,0 ;page number: 0 = in graphics modes
int 10h ;Video (Int 10)
MOV AH,02h ;Write characters only at cursor position (Int 10/0A)
MOV DL,'@' ;Character
INT 21H
ENDM
CLS MACRO ;Clear Screen
MOV AH, 00H ;Set video mode
MOV AL, 03H ;Video mode 80x25, 8x8, 16, 4, B800, CGA
INT 10H ;Video (Int 10)
ENDM
.model small
.stack
.code
.startup
CLS
MARCO 1,1,22,78
MARCO 5,15,15,25
MARCO 3,3,8,8
MARCO 3,30,18,70
;Enviar cursor a ultima línea
MOV AH,02h ;Set cursor position (Int 10/02)
MOV DX,1700H ;Row & Col
MOV BH,0 ;Page number: 0 = in graphics mode
int 10h
.exit
end
;El programa, utiliza macros. funciona con LOOP. y utiliza la función 02h de la interreucipon 21h
;02:15 p.m. Miercoles, 18 de Octubre de 2006
MARCO MACRO FILA1, COL1, FILA2, COL2
LOCAL LINE_TOP
LOCAL EXIT_TOP
LOCAL LINE_BOTTOM
LOCAL EXIT_BOTTOM
LOCAL LINE_LEFT
LOCAL EXIT_LEFT
LOCAL LINE_RIGHT
LOCAL EXIT_RIGHT
;Recorremos desde COL2 hasta COL1 en FILA1
MOV cl,COL2 ;El contador decrementará desde COL2
LINE_TOP: ;
MOV AH,02h ;Set cursor position (Int 10/02)
MOV DH,fila1 ;Row
MOV DL,cl ;Column
MOV BH,0 ;page number: 0 = in graphics modes
int 10h ;Video (Int 10)
MOV AH,02h ;Write attributes/characters at cursor position (Int 10/09)
MOV DL,'+' ;Character
INT 21H ;
CMP Cl,COL1
je EXIT_TOP
LOOP LINE_TOP ;dec cx;cmp cx,0;jne line_left;
EXIT_TOP:
;Recorremos desde COL2 hasta COL1 en FILA2
MOV cl,col2
LINE_BOTTOM:
MOV AH,02h ;Set cursor position (Int 10/02)
MOV DH,fila2 ;Row
MOV DL,cl ;Column
MOV BH,0 ;page number: 0 = in graphics modes
int 10h ;Video (Int 10)
MOV AH,02h ;Write characters only at cursor position (Int 10/0A)
MOV DL,'+' ;Character
INT 21H
CMP Cl,COL1
je EXIT_BOTTOM
LOOP LINE_BOTTOM ;dec cx;cmp cx,0;jne line_left;
EXIT_BOTTOM:
;Recorremos desde FILA2 hasta FILA1 en COL1
MOV cl,FILA2
LINE_LEFT:
MOV AH,02h ;Set cursor position (Int 10/02)
MOV DH,cl ;Row
MOV DL,COL1 ;Column
MOV BH,0 ;page number: 0 = in graphics modes
int 10h ;Video (Int 10)
MOV AH,02h ;Write characters only at cursor position (Int 10/0A)
MOV DL,'+' ;Character
INT 21H
CMP Cl,FILA1
je EXIT_LEFT
LOOP LINE_LEFT ;dec cx;cmp cx,0;jne line_left;
EXIT_LEFT:
;Recorremos desde FILA2 hasta FILA1 en COL2
MOV cl,FILA2
LINE_RIGHT:
MOV AH,02h ;Set cursor position (Int 10/02)
MOV DH,cl ;Row
MOV DL,COL2 ;Column
MOV BH,0 ;page number: 0 = in graphics modes
int 10h ;Video (Int 10)
MOV AH,02h ;Write characters only at cursor position (Int 10/0A)
MOV DL,'+' ;Character
INT 21H
CMP Cl,FILA1
je EXIT_RIGHT
LOOP LINE_RIGHT ;dec cx;cmp cx,0;jne line_left;
EXIT_RIGHT:
;Dibujamos esquinas
MOV AH,02h ;Set cursor position (Int 10/02)
MOV DH,FILA1 ;Row
MOV DL,COL1 ;Column
MOV BH,0 ;page number: 0 = in graphics modes
int 10h ;Video (Int 10)
MOV AH,02h ;Write characters only at cursor position (Int 10/0A)
MOV DL,'@' ;Character
INT 21H
MOV AH,02h ;Set cursor position (Int 10/02)
MOV DH,FILA1 ;Row
MOV DL,COL2 ;Column
MOV BH,0 ;page number: 0 = in graphics modes
int 10h ;Video (Int 10)
MOV AH,02h ;Write characters only at cursor position (Int 10/0A)
MOV DL,'@' ;Character
INT 21H
MOV AH,02h ;Set cursor position (Int 10/02)
MOV DH,FILA2 ;Row
MOV DL,COL1 ;Column
MOV BH,0 ;page number: 0 = in graphics modes
int 10h ;Video (Int 10)
MOV AH,02h ;Write characters only at cursor position (Int 10/0A)
MOV DL,'@' ;Character
INT 21H
MOV AH,02h ;Set cursor position (Int 10/02)
MOV DH,FILA2 ;Row
MOV DL,COL2 ;Column
MOV BH,0 ;page number: 0 = in graphics modes
int 10h ;Video (Int 10)
MOV AH,02h ;Write characters only at cursor position (Int 10/0A)
MOV DL,'@' ;Character
INT 21H
ENDM
CLS MACRO ;Clear Screen
MOV AH, 00H ;Set video mode
MOV AL, 03H ;Video mode 80x25, 8x8, 16, 4, B800, CGA
INT 10H ;Video (Int 10)
ENDM
.model small
.stack
.code
.startup
CLS
MARCO 1,1,22,78
MARCO 5,15,15,25
MARCO 3,3,8,8
MARCO 3,30,18,70
;Enviar cursor a ultima línea
MOV AH,02h ;Set cursor position (Int 10/02)
MOV DX,1700H ;Row & Col
MOV BH,0 ;Page number: 0 = in graphics mode
int 10h
.exit
end
En un disco tenemos un fichero con una serie de MACROS y que se llama:
MACROS.ASM:
Listado de MACROS.ASM
retorno MACRO
MOV ah, 4ch
INT 21h
ENDM
display MACRO cadena
MOV dx, OFFSET cadena
MOV ah, 09h
INT 21h
ENDM
leer_teclado MACRO
MOV ah, 08h
INT 21h
ENDM
En nuestro ordenador estamos realizando nuestro programa:
PILA SEGMENT STACK 'STACK'
dw 100h dup (?)
PILA ENDS
DATOS SEGMENT 'DATA'
paso db "MIOOO"
control db 5 dup (?)
men1 db "Clave de acceso:".13,10,"$"
men2 db "Bienvenido","$"
DATOS ENDS
CODIGO SEGMENT 'CODE'
ASSUME CS: CODIGO, DS: DATOS,
SS: PILA
EMPEZAR:
MOV ax, DATOS
MOV ds, ax
INCLUDE A:\ MACROS,ASM ;
Aquí le decimos al programa que incluya las macros del porgrama que se encuentra en el fichero MACROS:ASM que
se encuentra en un disco en la unidad A de nuestro ordenador.
DOS:
MOV si, 0
display men1 ;
"display" es una MACRO que tiene parámetro.
MOV cx, 5
UNO:
leer teclado ; Otra
MACRO. Esta macro no tiene parámetros.
MOV control[SI], al
INC si
LOOP UNO
MOV si, 0
MOV cx, 5
TRES:
MOV al, control[SI]
CMP al, paso[SI]
JNE DOS
INC SI
LOOP TRES
display men2 ; Otra
MACRO
retorno ;
Otra MACRO sin parámetros
CODIGO ENDS
No hay comentarios:
Publicar un comentario