汇编之宏(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(‘’ 单元