汇编之宏(macro)和子程序(proc)

1.将 bl 和 cl 中的数字相加并输出结果

DATA SEGMENT 
    STR1 DB 0AH,0DH ,'THE RESULT IS : $' ;0AH,0DH 为换行
DATA ENDS 

CODE SEGMENT 
    ASSUME CS:CODE,DS:DATA 
START:
PRINT MACRO STR  ; MACRO 为宏
    MOV AX,DATA 
    MOV DS,AX
    MOV DX,OFFSET STR 
    MOV AH,09H ; 打印STR
    INT 21H 
ENDM

ADDBLCL MACRO R1,R2 ;
    MOV AL,R1 
    ADD AL,R2
    DAA  ; 压缩型BCD码加法调整指令 ,默认调整 al

    PUSH AX 
    MOV CL,4
    SHR AL,CL ; 逻辑右移指令
    CALL PRINT_DL ;子程序调用

    POP AX  
    AND AL,0FH
    CALL PRINT_DL 
ENDM 

    PRINT STR1
    ADDBLCL 25H,48H
    PRINT STR1
    ADDBLCL 15H,15H 

    MOV BL,78H
    MOV CL,20H
    PRINT STR1
    CALL TT ;子程序调用

    MOV BL,11H
    MOV CL,22H
    PRINT STR1
    CALL TT

    MOV AX ,4C00H
    INT 21H ;return dos 

PRINT_DL  PROC ;子程序的实现与声明
    ADD AL,30H
    MOV DL,AL 
    MOV AH,02H
    INT 21H
    RET 
PRINT_DL ENDP 

TT PROC 
    MOV AL,CL 
    ADD AL,BL
    DAA  
    PUSH AX 
    MOV CL,4
    SHR AL,CL ;
    CALL PRINT_DL ;
    POP AX  
    AND AL,0FH
    CALL PRINT_DL 
    RET 
TT ENDP

    CODE ENDS 
END START

小结:

1. shl和shr指令的使用

shl:逻辑左移指令
shr:逻辑右移指令

<1>功能:

(1)将一个寄存器或内存单元中的数据向X移位;
(2)依次将移出的每一位写入CF中
(3)不够的用0补充

<2>注意事项:

如果移动位数大于1时,必须将移动位数放在cl中

2. DAA :压缩型BCD码加法调整指令(属于十进制调整指令)

压缩型BCD码:   (18)=0001 1000
非压缩型BCD码: (18)=0000 0001
                   0000 1000    

<1>注意事项:

默认调整 AL 

3. 子程序写法1:放在返回dos之后

    MOV AX ,4C00H
    INT 21H ;return dos 

PRINT_DL  PROC ;子程序的实现与声明
    ADD AL,30H
    MOV DL,AL 
    MOV AH,02H
    INT 21H
    RET 
PRINT_DL ENDP 

4. 子程序写法2 :

CODE SEGMENT 
    ASSUME CS:CODE,DS:DATA
START:
MAIN PROC
    MOV AX,DATA
    MOV DS,AX 
    ......
    CALL PRINT

    MOV AX,4C00H
    INT 21H
MAIN ENDP 
PRINT PROC
    ...
PRINT ENDP
    CODE ENDS
END START 

这里写图片描述

2. 机器询问姓名,人手动输入,之后机器在屏幕显示 。

DATA SEGMENT 
    MSG1 DB 0AH,0DH,"WHAT'S YOUR NAME : $"
    MSG2 DB 100,?,100 DUP('$') 
    ;第一个参数代表总空间大小,第一个参数代表实际输入,100 dup('$')
    ; 初始化100 个 '$' 单元
    MSG3 DB 0AH,0DH,"YOU NAME IS : $" 
DATA ENDS 
CODE SEGMENT 
    ASSUME CS:CODE,DS:DATA
START:
MAIN PROC
    MOV AX,DATA
    MOV DS,AX 

    MOV DX,OFFSET MSG1 
    CALL PRINT

    MOV DX,OFFSET MSG2 
    MOV AH,10 ;(0AH)从第三个单元开始存放
    INT 21H

    MOV DX,OFFSET MSG3
    CALL PRINT

    MOV DX,OFFSET MSG2 
    ADD DX,2
    CALL PRINT

    MOV AX,4C00H
    INT 21H
MAIN ENDP 
PRINT PROC
    MOV AH,09H
    INT 21H
    RET 
PRINT ENDP
    CODE ENDS
END START 

1. 10 号 dos 功能调用

MOV DX,OFFSET MSG2 
MOV AH,10 ;(0AH)从MSG2第三个单元开始存放
INT 21H
调用号 功能 入口参数 出口参数
0AH 输入字符串 DS:DX=缓冲区首址
09H 显示字符串 DS:DX=缓冲区首址

2.

MSG2 DB 100,?,100 DUP('$') 

第一个参数代表总空间大小,第一个参数代表实际输入的字符个数,100 dup(‘);100’ 单元
这里写图片描述

原文地址:https://www.cnblogs.com/Tattoo-Welkin/p/10335290.html