实验课程名称 微型计算机原理实验报告 实验项目名称 子程序实验(一) 专 业 班 级 电子信息科学与技术08级1班 学 生 姓 名 学 号 实 验 成 绩 指导教师签字
理 学 院
实验时间:2010年11月16日
实验四 子程序实验(一)
本实验的目的在于让读者掌握同一模块内的子程序调用的方法。 1.实验目的
(1)掌握主程序与子程序之间的调用关系及其调用方法。 (2)掌握子程序调用过程中近程调用与过程调用的区别。 (3)掌握通过堆栈传送参数的方法。 2.实验内容
(1)将BUP开始的10个单元中的二进制数转换成两位进制数的ASCII码,并在屏幕上显示出来。要求码型转换通过子程序HEXASC实现,在转换过程中,通过子程序DISP实现显示。
(2)编写一个主程序,从键盘接收基于个字符,然后用远调用的方法,调用子程序统计该字符串中字符“b”的个数。子程序的是字符串的首地址TABLE、字符长度N及字符“b”。子程序返回字符“b”的个数。参数传送采用堆栈实现。主程序在子程序返回后,显示字符“b”及其个数(设为一位十六进制数)。 3.实验说明
(1)第一个实验程序用子程序的近程调用实现。由于在调用HEXASC子程序时,子程序双调用了DISP子程序,这叫做子程序的嵌套调用。实验过程中可以从堆栈的内容看到两个子程序的返回地址值。由于是近调用,地址值只包括返回地址的段内偏移量。在每个子程序的所选中,检查CS值是不变的。
(2)第二个程序是利用远调用的方法调用子程序的。在无调用情况下,主程序与子程序自在不同的逻辑代码段中,可在子程序执行中查看CS值,它与主程序中的CS传下是不同的。子程序调用,堆栈中保留了返回地址的段地址及段内偏移量。
(3)第二个程序中,主程序与子程序之间参数的传送是由堆栈实现的。一段是将参数(此处是串首址TABLE,串的长度N及统计的字符“b”)顺序大雨复没床堆栈,在子程序调用后,通过BP指针对堆栈中的参数访问,并将统计的结果通过堆栈返回。有关该方法的原理此处不再介绍。 4.实验准备
(1)预习子程序设计的基本方法,根据实验内容要求,画出主程序及子程序的流程图。 (2)熟悉键盘输入字符串及用堆栈传送参数的程序段编制方法。
5.实验步骤
(1)编辑、汇编两个源程序,生成相应的可执行文件(.EXE)。 (2)有DEBUG的R命令、T命令或G命令和D命令检查远程调用及近程调用时堆栈的变化。特别是通过堆栈传送的参数和子程序取出的参数是返回参数的详细过程。 (3)检查程序执行的结果是否正确。
6.实验报告要求
(1)分析远程调用与近程调用的区别,在用DEBUG有关命令观察时,执行过程有何不同。 (2)说明用堆栈传送参数的过程及具体的方法。
(3)分析实验结果及所南至的问题,并说明解决的方法。 7.参考程序清单
(1)码型转换程序清单:
DATA BUF DATA CODE
SEGMENT
DB 0ABH,0CDH,0DEH,01H,02H,03H DB 3AH,4BH,5CH,6FH ENDS SEGMENT
ASSUME CS:CODE,DS:DATA
AX,DATA DS,AX
CX,10
MOV MOV
START: MOV
LEA BX,BUF
AGAIN: MOV AL,[BX]
CALL INC LOOP MOV INT
HEXASC BX AGAIN AH,4CH 21H
HEXASC PROC NEAR MOV DL,AL ;!此处有错误,程序运行时AL中的数据已被
破坏,可改为[BX]
PUSH MOV SHR POP CALL MOV AND CALL
CX CL,4 DL,CL CX DISP DL,AL
DL,0FH DISP ;显示低位HEX数
;显示高位HEX数
RET
HEXASC ENDP DISP
PROC
CMP
DL,9
NEXT DL,7
DL,30H ;将一位HEX数转为ASCII码 AH,2
21H ;显示
JBE ADD NEXT: ADD
MOV INT RET ENDP ENDS END
DISP CODE
START
2
微型计算机原理实验报告
|
运行结果:
(2)统计并显示某键入字符的个数的程序: DATA
;COUNTER.ASM
SEGMENT
CHAR DB 'b' BUF DB 50H,?,50H DUP(?) ;!“?”号应有一“,” DATA ENDS
MCODE SEGMENT ASSUME CS:MCODE,DS:DATA START: MOV
AX,DATA
DS,AX DX,BUF AH,9 ;!应为10号调用,从键盘接收数据
MOV LEA MOV
INT LEA MOV MOV INC INC MOV MOV PUSH PUSH PUSH CALL MOV MOV INT MOV MOV INT POP MOV MOV INT MOV PUSH MOV SHR CMP JBE ADD
21H SI,BUF
CL,[SI+1] CH,0 ;CX中为字符串长度 SI SI
;SI指向串首址TABLE
AL,CHAR AH,0 ;AX中为待查字符 SI CX AX
;参数送堆栈
CHECK ;!远调用子程序,应为CALL FAR PRT CHECK DL,0DH AH,2 21H
DL,0AH AH,2 21H AX AH,2 21H DL,AL AX CL,4 DL,CL DL,9 NEXT2 DL,7 DL,30H AH,2 21H AX DL,AL DL,0FH DL,9 NEXT DL,7 DL,30H AH,2 21H AH,4CH 21H
;显示统计个数的低位
;统计个数在AL中
DL,CHAR
;显示待检字符
NEXT2: ADD MOV
INT POP MOV AND CMP
JBE ADD NEXT: ADD
4
MOV INT MOV INT
微型计算机原理实验报告
|
MCODE ENDS
SCODE SEGMENT
ASSUME CS:SCODE CHECK PROC FAR
PUSH MOV MOV MOV MOV
BP BP,SP SI,[BP+10] CX,[BP+8] AX,[BP+6] AH,AH AL,[SI]
XOR AGAIN: CMP NEXT1:
CHECK
JNE NEXT1 INC AH INC SI
LOOP AGAIN MOV MOV POP RET 4 ENDP END
AL,AH [BP+10],AX BP
;!代码段应有结束语句“SCODE START
ENDS”
程序执行结果:
6
微型计算机原理实验报告
|