- 1、本文档共7页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
微机原理和应用练习7
练习七 子程序实验
目的
掌握主程序与子程序之间的调用关系及调用方法;
掌握子程序调用过程中近程调用与远程调用的区别;
掌握通过堆栈转送参数的方法。
内容
将BUF开始的10个单元中的二进制数转换成两位十六进制数的ASCII码,在屏幕上显示出来。要求码型转换通过子程序HEXAC实现,在转换过程中,通过子程序DISP实现显示。
编写一个主程序,从键盘接收若干个字符,然后用远调用的方法,调用子程序统计字符串中字符”b”的个数.子程序的参数是字符串的首地址TABLE,字符串长度N及字符”b”.子程序返回字符”b”的个数.参数传送采用堆栈实现.主程序在子程序返回后,显示字符”b”及其个数(设为一位十六进制数)。
环境
PC微机
DOS操作系统或 Windows 操作系统
MASM.EXE,LINK.EXE,DEBUG.COM或宏汇编集成环境
要求
第一个实验程序用子程序的近程调用实现。由于在调用HEXASC子程序时,子程序又调用了DISP??程序,这叫子程序的嵌套调用。实验过程中可以从堆栈的内容看到两个子程序的返回地址值。由于是近调用,地址值只包括返回地址的段内偏移量。在每个子程序的执行中,检查CS值是不变的。
第二个程序是利用远调用的方法调用子程序的。在远调用情况下,主程序与子程序处在不同的逻辑代码段中,可在子程序执行中查看CS值,它与主程序中的CS值是不同的。子程序调用后,堆栈中保留了返回地址的段地址及段内偏移量。
第二个程序中,主程序与子程序之间参数的传送是由堆栈实现的。一段是将参数(此处是串首址TABLE,串的长度N及待统计的字符“b”)顺序压如堆栈,在子程序调用后,通过BP指针对堆栈中的参数访问,并将统计的结果通过堆栈返回。有关该方法的原理此处不再介绍。
预习子程序设计的基本方法,根据实验内容要求,画出子程序及主程序的流程图; 熟悉键盘键入字符串及用堆栈传送参数的程序段编制方法。
主要步骤
编辑、汇编两个源程序,生成相应的可执行文件(.EXE)
用DEBUG的R命令,T命令或G命令和D命令检查远程调用及近程调用时堆栈的变化。特别是通过堆栈传送的参数和子程序取出的参数是返回参数的详细过程。
检查程序执行的结果是否正确。
内容1流程图:
主程序 子程序HEXASC
子程序DISP
内容1结果:
内容2流程图:
主程序 子程序
内容2结果:
内容1代码:
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
LEA BX,BUF
MOV CX,0AH
LOP: MOV AL,[BX]
CALL HEXASC
INC BX
LOOP LOP
MOV AH,4CH
INT 21H
HEXASC PROC NEAR
PUSH CX
PUSH AX
MOV DL,AL
MOV CL,4
SHR DL,CL
CALL DISP
POP AX
MOV DL,AL
AND DL,0FH
CALL DISP
POP CX
RET
HEXASC ENDP
DISP PROC NEAR
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(?)
DATA ENDS
MCODE SEGMENT
ASSUME CS:MCODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
LEA DX,BUF
MOV AH,10
INT 21H
MOV DL,0AH
MOV AH,2
INT 21H
LEA SI,BUF
MOV CL,[SI+1]
MOV CH,0
INC SI
INC SI
MOV AL, CHAR
MOV AH,0
PUSH SI
PUSH CX
PUSH AX
CALL FAR PTR CHECK
POP AX
PUSH AX
MOV DL,AL
MOV CL,4
SHR DL,CL
CMP DL,9
JBE J1
ADD DL,7
J1: ADD DL,30H
MOV AH,
文档评论(0)