周五,周六没有看,周日把29,30一起看了。
29讲内容为子程序调用的参数传递。
子程序调用的参数传递主要有几种:利用寄存器传递参数,利用约定存储单元传递参数,利用堆栈传递参数。
利用约定存储单元传递参数可适用于参数较多的情况下。
例:32位数相加
; 子程序名: MADD
; 功能: 32位数相加
; 入口参数: DATA1和DATA2缓冲区中分别存放要相加的32位数
; 出口参数: DATA3缓冲区中存放结果。
; 说明: (1) 32位数据采用高高低低的原则存放在缓冲区中
; (2) 可能产生的进位存放在DATA3开始的第5个字节中
MADD PROC
PUSH AX
PUSH CX
PUSH SI
MOV CX, 2
XOR SI, SI
MADD1: MOV AX, WORD PTR DATA1[SI]
ADC AX, WORD PTR DATA2[SI]
MOV WORD PTR DATA3[SI], AX
INC SI
INC SI
LOOP MADD1
MOV AL, 0
ADC AL, 0
MOV BYTE PTR DATA3 + 4, AL
POP SI
POP CX
POP AX
RET
MADD ENDP
利用堆栈传递参数,把要传递的参数依次压入堆栈中进行传递。
例:
; 子程序名: STRLEN
; 功 能: 测量字符串的长度
; 入口参数: 字符串起始地址的段值和偏移在堆栈中
; 出口参数: AX=字符串长度
STRLEN PROC
PUSH BP
MOV BP, SP
PUSH DS
PUSH SI
MOV DS, [BP + 6]
MOV SI, [BP + 4]
MOV AL, 0
STRLEN1: CMP AL, [SI]
JZ STRLEN2
INC SI
JMP STRLEN1
STRLEN2: MOV AX, SI
SUB AL, [BP + 4]
POP SI
POP DS
POP BP
RET
STRLEN ENDP
; 调用程序
MOV AX, SEG STRMESS
PUSH AX
MOV AX, OFFSET STRMESS
PUSH AX
CALL STRLEN
ADD SP 4
MOV LEN, AX
第30讲开始,讲DOS功能调用及应用。
DOS功能主要有三类,设备驱动(基本I/O),文件管理及其他(内存管理,置取时间,置取中间向量,中止程序等)
DOS功能调用分为三步:
1) 准备入口参数
2) 将调用号送入AH
3) 软中断指令INT 21H
1.基本I/O功能调用
1) 键盘输入
1号功能: 带回显的键盘输入, 输入字符送入DL中,检测CTRL+BREAK键,如果按下,则停止等待
8号功能: 不带回显的键盘输入,但是会检测用户按下CTRL+BREAK时停止。
7号功能: 不带回显的键盘输入,也不检测是否按下CTRL+BREAK
2) 键盘输出
2号功能: 向标准输出设备输出显示一个字符,入口参数放入DL
9号功能: 显示输出一个字符串,输出字符串首地址在DS: DX中,输出字符串以$结束。
3) 递归调用
直接调用它自身,称为直接递归调用。递归子程序必须使用寄存器或堆栈传递参数
例:用2进制形式显示所按键的ASCII码
CSEG SEGMENT
ASSUME CS: CSEG, DS: CSEG
START: MOV AH, 1
INT21H
CALL NEWLINE ; 回车换行
MOV BL, AL
MOV CX, 8
NEXT: SHL BL, 1
MOV DL, 30H
ACD DL, 0
MOV AH, 2
INT 21H
LOOP NEXT
MOV DL, 'B'
MOV AH, 2
INT 21H
MOV AH, 4CH
INT 21H
CSEG ENDS
END START
; NEWLINE
; 回车换行
NEWLINE PROC
PUSH AX
PUSH DX
MOV DL, 0DH
MOV AH, 2
INT 21H
MOV DL, 0AH
MOV AH, 2
INT 21H
POP DX
POP AX
RET
NEWLINE ENDP
例2:求阶乘
; FACT
; n!
; (AX) = n
; (AX) = n!
FACT PROC
PUSH DX
MOV DX, AX
CMP AX, 0
JZ DONE
DEC AX
CALL FACT
MUL DX
POPDX
RET
DONE: MOV AX, 1
POP DX
RET
FACT ENDP