《汇编语言程序设计》上机实验指导书
TABLE,串的长度N及待统计的字符“b”)顺序压如堆栈,在子程序调用后,通过BP指针对堆栈中的参数访问,并将统计的结果通过堆栈返回。有关该方法的原理此处不再介绍。 4.实验准备
(1)预习子程序设计的基本方法,根据实验内容要求,画出子程序及主程序的流程图。 (2)熟悉键盘键入字符串及用堆栈传送参数的程序段编制方法。 5.实验步骤
(1)编辑、汇编两个源程序,生成相应的可执行文件(。EXE)
(2)用DEBUG的R 命令,T 命令或G命令和D命令检查远程调用及近程调用时堆栈的变化。特别是通过堆栈传送的参数和子程序取出的参数是返回参数的详细过程。 (3)检查程序执行的结果是否正确。 6.实验报告要求
(1)分析远程调用与近程调用的区别,在用DEBUG有关命令观察时,执行过程有何不同。 (2)说明用堆栈传送参数的过程及其具体方法。 (3)分析实验结果及所遇到问题,并说明解决的方法。 7.参考程序清单 (1)码型转换程序清单: ;CONV.ASN
DATA SEGMENT
BUF DB 0ABH,0CDH,0DEH,01H,02H,03H DB 3AH,4BH,5CH,6FH DATA ENDS CODE SEGMENT
ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV CX,10 LEA BX,BUF AGAIN: MOV AL, [BX] CALL HEXASC INC BX LOOP AGAIN MOV AH,4CH INT 21H
- 6 -
《汇编语言程序设计》上机实验指导书
HEXASC PROC NEAR PUSH AX MOV DL,AL PUSH CX MOV CL,4 SHR DL,CL POP CX
CALL DISP ;显示高位HEX数 POP AX MOV DL,AL AND DL,0FH CALL DISP RET HEXASC ENDP DISP PROC
CMP DL,9 JBE NEXT ADD DL,7 NEXT: ADD DL,30H MOV AH,2
INT 21H ;显示 RET DISP ENDP CODE ENDS
END START
(2)统计并显示键入字符串中某字符的个数 DATA SEGMENT CHAR DB 'b'
BUF DB 50H, ?,50H DUP(?) CRLF DB 0DH,0AH,'$' DATA ENDS MCODE SEGMENT
- 7 -
《汇编语言程序设计》上机实验指导书
ASSUME CS:MCODE, DS:DATA START: MOV AX,DATA MOV DS,AX LEA DX,BUF MOV AH,0AH INT 21H LEA DX,CRLF MOV AH,9 INT LEA MOV MOV INC INC MOV MOV PUSH PUSH PUSH CALL MOV MOV INT POP MOV AND CMP JBE ADD NEXT: ADD MOV INT MOV
21H SI,BUF CL, [SI+1]
CH, 0 ;CX中为字符串长度 SI
SI ;SI指向串首址TABLE AL,CHAR
AH,0 ;AX中为待查字符 SI CX
AX ; 参数送堆栈 FAR PTR CHECK DL,CHAR AH,2 21H
AX ;统计个数在AL中 DL,AL DL, 0FH DL,9 NEXT DL,7 DL,30H AH,2
21H ;显示统计个数 AH,4CH
- 8 -
《汇编语言程序设计》上机实验指导书
INT 21H MCODE ENDS SCODE SEGMENT
ASSUME CS:SCODE CHECK PROC FAR PUSH BP MOV BP,SP MOV SI,[BP+10] MOV CX, [BP+8] MOV AX, [BP+6] XOR AH, AH AGAIN: CMP AL,[SI] JNE NEXT1 INC AH NEXT1: INC SI LOOP AGAIN MOV AL, AH MOV [BP+10],AX POP BP RET 4 CHECK ENDP SCODE ENDS
END START
二、本程序的目的在于使读者掌握模块间调用子程序的编写方法. 1.实验目的
(1) 了解多模块程序设计方法。
(2) 学会使用PUBLEC和EXTRN 伪指令解决模块间的符号(如变量名,标号等)通信问题。 2. 实验内容
(1)编写一个子程序,将主程序设定的内存中字符串的小写字母转换成大写字母并显示出来.主程序用另一个模块编写。
(2)编写一个子程序,将主程序指定的字符所在的地址返回给主程序,字符串与主程序在同一个模块。 3.实验准备
- 9 -
《汇编语言程序设计》上机实验指导书
(1)仔细阅读教材中有关模块间通信的方法及模块程序设计的方法。 (2)弄清伪指令PUBLIC及EXTRN的功能及用法。 4.实验步骤
(1)分别对实验1和实验2的主、子模块进行汇编,在连接时,将它们装配成一个以 .EXE为扩展名的可执行文件.观察汇编及连接过程中有无错误. (2)对.EXE 文件进行调试及运行.
(3)将实验1中的原字符串改为由键盘输入,然后由子模块将源串中的小写字母转换为大写字母,并将源串与转换后的两个字串分两行显示出来(设键入字串长度小于80个字符). 5.实验报告要求
(1)对愿程序清单,画出相应的程序流程图. (2)扼要总结多模块程序的特点和编写方法. 6.参考程序清单
(1)转换字符串小写字母为大写字母的程序清单: EXTRN DNTOUP:FAR PUBLIC STRING1,STRING2 DATA SEGMENT
STRING1 DB 'thIs is A book','$' STRING2 DB 80 DUP(?) DATA ENDS CODE SEGMENT
ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS, AX
CALL FAR PTR DNTOUP MOV AH,4CH INT 21H CODE ENDS
END START
;DNTOUP.SM为子模块的文件名 PUBLIC DNTOUP
EXTRN STRING1:BYTE,STRING2:BYTE CODE SEGMENT
- 10 -