第6章子程序设计
本章要点:子程序的定义、调用和返回,寄存器的保护盒恢复,参数传递方法尤其是堆栈传递参数,模块化程序设计的基本方法,DOS功能调用。
一、单项选择题
6.1.1 下列叙述不正确的是(A)。
A. 在子程序中的保护现场只能用堆栈来实现
B. 在子程序中的保护现场用堆栈来实现是其中的一种方法
C. 在子程序中的保护现场可以有多种实现方法
D. 在子程序中的保护现场可以将要保护的内容送内存变量来实现
6.1.2 下列叙述不正确的是(B)。
A. 在汇编语言程序中,每一个过程允许有多条RET指令
B. 在汇编语言程序中,每一个过程只允许出现一条RET指令
C. 在汇编语言程序中,每一个过程结束之前一定有一条RET指令
D. 在汇编语言程序中,以过程形式表示的代码段一定有一条RET指令存在
6.1.3 下列叙述正确的是(B)。
A. 执行一条段内返回指令,先从堆栈弹出两个字节的内容,然后SP-2。
B. 执行一条段内返回指令,先从堆栈弹出两个字节的内容,然后SP+2。
C. 执行一条段内返回指令,先从SP-2,然后从堆栈弹出两个字节的内容。
D. 执行一条段内返回指令,先从SP+2,然后从堆栈弹出两个字节的内容。
6.1.4 在进行DOS功能调用时,其功能号应先送(C)。
A. AL寄存器
B. BL寄存器
C.AH寄存器
D. DH寄存器
二、填空题
6.2.1 在子程序的设计中,通常用堆栈来保护现场和恢复现场。而堆栈的操作原则是__先进后出,或后进先出___。
6.2.2 如果主程序和子程序在同一代码段中,则主程序调用子程序时只改变__偏移__地址;如果主程序和子程序不在同一代码段中,则主程序调用子程序时要改变__段地址和偏移_____地址。
6.2.3 一个子程序调用另一个子程序称为___子程序嵌套____;一个子程序直接或间接调用该子程序本身称为___递归(调用)_。
6.2.4 以过程定义的子程序有两种类型的属性,它们分别是___NEAR_____和___FAR_______。
6.2.5 在用9号DOS功能调用进行字符串输出时,要求输出字符串以___$____为结束符。
三、简答题
6.3.1 简述一个完整的子程序结构应该包含哪几个方面的内容?
子程序定义、保护和恢复现场、主体、RET
6.3.2 调用程序和子程序之间一般使用哪几种参数传递方法?它们各自的特点是什么?
寄存器、堆栈、存储器
四、程序分析题
6.4.1 现有程序如下:
DA TA SEGMENT
BUF DB80 DUP(0)
DA TA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DA TA START: MOV AX,DA TA
MOV DS,AX
LEA DI,BUF
NEXT:MOV AH,1
INT21H
CMP AL,0DH
JZ EXIT
CALL STO
JMP NEXT
EXIT: MOV AH,2
MOV DL,0DH
INT21H
MOV DL,0AH
INT21H
MOV BYTE PTR [DI],'$'
LEA DX,BUF
MOV AH,9
INT21H
MOV AH,4CH
INT21H
STO PROC
CMP AL,30H
JB DOWN
CMP AL,39H
JA DOWN
MOV[DI],AL
INC DI
DOWN:RET
STO ENDP
CODE ENDS
END START
请回答:(1)STO子程序完成的功能是__判断从键盘输入的是否为0~9的数字字符__;
(2)该程序完成的功能是__从键盘输入字符串以回车结束,将其中的数字字符存入BUF,并显示这些数字字符__。
6.4.2 现有程序如下:
STACK SEGMENT STACK 'STACK'
DB64 DUP(?)
STACK ENDS
DA TA SEGMENT
A DB30
B DB9
C DW5
DA TA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DA TA,SS:STACK
MAIN PROC FAR
PUSH DS
MOV AX,0
PUSH AX
MOV AX,DA TA
MOV DS,AX
MOV CX,C
MOV BH,B
MOV BL,A L1:PUSH BX
CALL SUB1
CALL SUB2
POP BX
INC BL
SUB BH,2
LOOP L1
RET
MAIN ENDP
SUB1PROC
字符串截取后六位PUSH AX
PUSH DX
L2:MOV DL,20H
MOV AH,2
INT21H
DEC BL
JNZ L2
POP DX
POP AX
RET
SUB1ENDP
SUB2PROC
PUSH AX
PUSH DX
L3:MOV DL,'*'
MOV AH,2
INT21H
DEC BH
JNZ L3
MOV DL,0DH
MOV AH,2
INT21H
MOV DL,0AH
INT21H
POP DX
POP AX
RET
SUB2ENDP
CODE ENDS
END MAIN
请回答:(1)SUB1子程序完成的功能是__显示输出BL寄存器所表示的空格数__;
(2)SUB2子程序完成的功能是__显示输出“*”,个数由BL寄存器所表示__;
(3)该程序完成的功能是__显示输出倒三角图形,第1行9个“*”,最后一行1个“*”,共5行。__。
五、程序填空题
6.5.1 下面的程序是将BUF1缓冲区的100个字单元的内容送BUF2缓冲区的子程序。请在程序的空格处填写适当的指令。
MOVE PROC
PUSH AX
PUSH SI
_PUSH DI______;(1)
PUSH CX
MOV CX,100
LEA SI,BUF1
LEA DI,BUF2
L:MOV AX,[SI]
_MOV [DI],AX___;(2)
_ADD SI,2______;(3)
ADD DI,2
_LOOP L_______;(4)
POP CX
POP DI
__POP SI______;(5)
POP AX
RET
MOVE ENDP
6.5.3 下面的程序是将AX寄存器中的16位无符号二进制数转换为十进制数显示输出的子程序。请在程序的空格处填写适当的指令。
DISP PROC
PUSH AX
PUSH BX
PUCH CX
PUSH DX
MOV CX,0
MOV BX,10
L:_MOV DX,0____;(1)
CMP AX,0
JZ DISP0
DIV BX
_PUSH DX_____;(2)
INC CX
JMP L
DISP0:CMP CX,0
JZ RE
POP DX
__ADD DL,30H__;(3)
MOV AH,2
INT21H
DEC CX
__JMP DISP0____;(4) RE:POP DX
POP CX
POP BX
POP AX
__RET_________;(5) DISP ENDP
6.5.2 下面的程序通过子程序调用完成在2个数组中出最大数,并将最大数存放在各自数组的后一个字单元。主子程序之间采用堆栈传递参数方式。请在程序的空格处填写适当的指令。
STACK SEGMENT STACK 'STACK'
DB64 DUP(?)
STACK ENDS
DA TA SEGMENT
BUF1DW2001H,45E5H,1234H,678AH,905DH,08F3H
N1EQU($-BUF1)/2
MAX1DW?
BUF2DW5678H,5E32H,3412H,8086H,0E234H,6635H,7329H
N2EQU($-BUF2)/2
MAX2DW?
DA TA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DA TA,SS:STACK
MAIN PROC FAR
PUSH DS
MOV AX,0
PUSH AX
MOV AX,DA TA
MOV DS,AX
LEA AX,BUF1
PUSH AX
MOV AX,N1
PUSH AX
CALL SMAX
LEA AX,BUF2
PUSH AX
MOV AX,N2
PUSH AX
CALL SMAX
RET
MAIN ENDP
SMAX PROC
PUSH BP
__MOV BP,SP__;(1)
PUSH AX
PUSH CX
PUSH SI
__PUSHF__;(2)
MOV SI,[BP+6]
MOV CX,__[BP+4]__;(3)
MOV AX,[SI]
DEC CX
NEXT:ADD SI,2
CMP AX,[SI]
JGE MAX
MOV AX,[SI]
MAX:LOOP NEXT
ADD SI,2
__MOV[SI],AX__;(4)
POPF
POP SI
POP CX
POP AX
POP BP
__RET4__;(5) SMAX ENDP
CODE ENDS
END MAIN
六、程序设计题
6.6.1编写子程序DISPBX,能将BX寄存器中的16位二进制数转换为十六进制数在屏幕上显示输出。DISPBX.ASM

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。