汇编语言实验报告
学院 计算机科学与技术学院 专业 计算机科学与技术专业 班级
学号
姓名
实验时间: 2011 年 11 月
一、 实验名称:子程序设计
二、 实验内容及要求:
理解 CALL 和 RET 指令,以及子程序的调用与返回过程;掌握子程序的结构,
及相关的设计方法;能合理地分解程序功能,有效地支持功能的重用。
三、 实验使用的关键技术和方法:
关键技术
方法
DOS 系统功能的
调用
MOV AH,01 AL=输入字符
INT 21H
MOV AH,02 DL=输出字符
INT 21H
MOV AH,09 DS:DX=串地址
INT 21H
子程序的调用与返回 Call DST
ret
保存与恢复寄存器
Push ax
pop
ax
子程序的参数传送
通过寄存器传送,通过存储器传送
等
1: 习题 5.22:从键盘输入一系列字符(以回车符结束),并按字母、数字及其他
字符分类计数,最后显示这三类字符的计数结果(使用子程序 BINIDEC)。
子程序 BINIDEC:将 BX 中的无符号数用十进制数的形式输出。
2::编写一个子程序嵌套结构的程序模块,分别从键盘输入姓名及 8 个字符的电
话号码,并以一定的格式显示出来。
主程序 TELIST:
显示提示符“INPUT NAME:”;
调用子程序 INPUT_NAME 输入姓名;
显示提示符“INPUT A TELEPHONE NUMBER:”;
调用子程序 INPHONE 输入电话号码;
调用子程序 PRINTLINE 显示姓名及电话号码。
调用键盘输入子程序 GETCHAR,把输入的姓名存放在 INBUF 缓冲
子程序 INPUT_NAME:
区中;
子程序 INPHONE:
把 INBUF 中的姓名移入输出行 OUTNAME。
调用键盘输入子程序 GETCHAR,把输入的 8 位电话号码存放在
INBUF 缓冲区中;
把 INBUF 中的号码移入输出行 OUTPHONE。
子程序 PRINTLINE:
显示姓名及电话号码,格式为:
NAME TEL.
X X X
XXXXXXXX
3. 解释执行一个算术运算表达式(至少可以执行加法和减法运算,自定义表达
式中数据的精度)
四、 实验设计方案说明:
习题 5.22 代码
DATAS SEGMENT
ALPHA DB 'The total of alpha is:','$'
NUMBER DB 'The total of number is:','$'
OTHER DB 'The total of other is:','$'
BUF DB 7 DUP(0),'$'
CRLF DB 0DH,0AH,'$'
DATAS ENDS
CODES SEGMENT
MAIN PROC FAR
ASSUME CS:CODES,DS:DATAS
START:
PUSH DS
SUB AX,AX
PUSH AX
MOV AX,DATAS
MOV DS,AX
MOV BX,0
MOV SI,0
MOV DI,0
INPUT:
MOV AH,01H
INT 21H
CMP AL,0DH
JE DISP
CMP AL,30H
JAE L1
OTHERS:
L1:
L2:
L3:
L4:
L5:
INC DI
JMP SHORT INPUT
CMP AL,39H
JA L2
INC SI
JMP SHORT INPUT
CMP AL,41H
JAE L3
JMP SHORT OTHERS
CMP AL,5AH
JA L4
INC BX
JMP SHORT INPUT
CMP AL,61H
JAE L5
JMP
SHORT OTHERS
CMP AL,7AH
JA SHORT OTHERS
INC BX
JMP
SHORT INPUT
DISP:
LEA DX,CRLF
MOV AH,09H
INT 21H
LEA DX,ALPHA
CALL DISPLAY
LEA DX,NUMBER
MOV BX,SI
CALL DISPLAY
LEA DX,OTHER
MOV BX,DI
CALL DISPLAY
RET
MAIN ENDP
DISPLAY PROC NEAR
MOV AH,09H
INT 21H
CALL BINIDEC
LEA DX,CRLF
MOV AH,09H
INT 21H
RET
DISPLAY ENDP
BINIDEC PROC NEAR
PUSH AX
PUSH SI
PUSH DX
MOV AX,BX
MOV CX,10
LEA SI,BUF+6
EXCHANGE:
MOV DX,0
DIV CX
ADD DL,30H
MOV [SI],DL
DEC SI
OR AX,AX
JNZ EXCHANGE
LEA DX,BUF
MOV AH,09H
INT 21H
POP DX
POP SI
POP AX
RET
BINIDEC ENDP
CODES ENDS
END MAIN
习题 6.9 代码
DATAS SEGMENT
INPUTNAME DB 'Please input name:','$'
INPUTTELE DB 'Please input a telephone number:','$'
OUTNAME DB 16 DUP(' '),'$'
OUTPHONE DB 12 DUP(' '),0DH,0AH,'$'
MESG DB 'NAME',12 DUP(' '),'TEL',0DH,0AH,'$'
CRLF DB 0DH,0AH,'$'
INBUF DB 12 DUP(' '),'$'
DATAS ENDS
STACKS SEGMENT
DW 100 DUP(?),'$'
TOS LABEL WORD
STACKS ENDS
CODES SEGMENT
MAIN PROC FAR
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,STACKS
MOV SS,AX
MOV SP,OFFSET TOS
PUSH DS
SUB AX,AX
PUSH AX
MOV AX,DATAS
MOV DS,AX
MOV ES,AX
BEGIN:
LEA DX,INPUTNAME
MOV AH,09H
INT 21H
CALL INPUT_NAME
LEA DX,INPUTTELE
MOV AH,09H
INT 21H
CALL INPHONE
CALL PRINTLINE
RET
MAIN ENDP
INPUT_NAME PROC NEAR
CALL GETCHAR
LEA SI,INBUF
LEA DI,OUTNAME
MOV CX,12
CLD
REP MOVSB
RET
INPUT_NAME ENDP
INPHONE PROC NEAR
CALL GETCHAR
LEA SI,INBUF
LEA DI,OUTPHONE
MOV CX,12
CLD
REP MOVSB
RET
INPHONE ENDP
GETCHAR PROC NEAR
MOV AL,20H
MOV CX,12
LEA DI,INBUF
CLD
REP STOSB
MOV CX,12
MOV DI,0
INPUT:
MOV AH,1
INT 21H
CMP AL,0DH
JZ QUIT
MOV INBUF[DI],AL
INC DI
LOOP INPUT
QUIT:
CALL DISP_CRLF
RET
GETCHAR ENDP
PRINTLINE PROC NEAR
LEA DX,MESG
MOV AH,09H
INT 21H
LEA DX,OUTNAME
MOV AH,09H
INT 21H
LEA DX,OUTPHONE
MOV AH,09H
INT 21H
RET
PRINTLINE ENDP
DISP_CRLF PROC NEAR
LEA DX,CRLF
MOV AH,09H
INT 21H
RET
DISP_CRLF ENDP
CODES ENDS
END MAIN
五、 测试及评估
习题 5.22 图
习题 6.9 图
第三题代码
DATAS SEGMENT
EXPRESSION DB 20 DUP(' '),'$'
DATAS ENDS
CODES SEGMENT
MAIN PROC FAR
ASSUME CS:CODES,DS:DATAS
START:
PUSH DS
SUB AX,AX
PUSH AX
MOV AX,DATAS
MOV DS,AX
LEA SI,EXPRESSION
L1:
MOV AH,01H
INT 21H
MOV [SI],AL
INC SI
CMP AL,0DH
JNE L1
MOV [SI],'$'
MOV AH,02H
MOV DL,0DH
INT 21H
MOV DL,0AH
INT 21H
CALL CAL
RET
六、 设计心得
通过本次试验,我对子程序结构的设计方法有了一定的认识,子程序相当
于高级语言中的过程和函数。在一个程序的不同部分,往往要用到类似的程序段,
这些程序段的功能和结构形式都相同,只是某些变量的赋值不同,此时就可以把
这些程序段写成子程序的形式,以便需要时可以调用它。