实验报告 子程序设计实验
子程序设计实验报告

实验名称:子程序设计实验日期:2023年X月X日实验地点:XX大学计算机实验室实验目的:1. 理解子程序的概念和作用。
2. 掌握子程序的设计方法和调用方式。
3. 学会使用子程序提高程序的可读性和可维护性。
实验内容:一、实验背景子程序是程序设计中常用的一种结构,它可以将一段具有独立功能的代码封装起来,方便在其他程序中调用。
使用子程序可以提高程序的可读性、可维护性和模块化程度。
二、实验环境1. 操作系统:Windows 102. 编译器:Visual Studio 20193. 编程语言:C++三、实验步骤1. 创建一个新的C++项目,命名为“子程序设计”。
2. 在项目中创建一个头文件“Subroutine.h”,用于声明子程序。
3. 在头文件中声明两个子程序:`Add` 和 `Subtract`。
4. 在头文件中定义一个全局变量 `Result`。
5. 在源文件“Subroutine.cpp”中实现头文件中声明的子程序。
6. 在主函数中调用子程序,并输出结果。
7. 编译并运行程序,观察输出结果。
四、实验代码1. 头文件“Subroutine.h”:```cpp#ifndef SUBROUTINE_H#define SUBROUTINE_Hvoid Add(int a, int b);void Subtract(int a, int b); int Result;#endif // SUBROUTINE_H```2. 源文件“Subroutine.cpp”:```cpp#include "Subroutine.h"void Add(int a, int b) {Result = a + b;}void Subtract(int a, int b) { Result = a - b;}```3. 主函数“main.cpp”:```cpp#include <iostream>#include "Subroutine.h"int main() {int a = 10;int b = 5;Add(a, b);std::cout << "Add: " << Result << std::endl;Subtract(a, b);std::cout << "Subtract: " << Result << std::endl;return 0;}```五、实验结果与分析1. 编译并运行程序,输出结果如下:```Add: 15Subtract: 5```2. 分析:(1)在实验中,我们首先在头文件中声明了两个子程序 `Add` 和 `Subtract`,它们分别用于计算两个整数的和与差。
程序设计实践实验报告

程序设计实践实验报告实验报告课程名称___ 程序设计实践______实验项目_______子程序设计实验仪器_______PC _____系别_ 计算机科学与工程____专业______软件工程__________班级/学号___B软工0701/2007011801学生姓名_____ XX____________实验日期____2009-3-26__________成绩_______________________指导教师_____XX______________.实验二子程序设计一、实验目的1. 学习和掌握参数传递的方法;2.学习和掌握递归调用;3.了解goto语句的使用;4.了解降低嵌套深度的方法;5.了解复杂度的度量。
二、实验要求1.通过编程实现,学习和理解参数传递和递归调用的使用。
2.使用goto语句编写程序,用非goto语句改写程序;3.了解减少嵌套层次和度量复杂度的方法。
三、实验内容和结果1. 参数传递(1)创建控制台应用程序项目(CLR)。
定义函数swap,swap函数有两个整型形参x,y,swap的功能为交换x和y的值,并依次显示出交换后的x,y的值。
主函数定义两个整型变量a,b,并赋不同的初值,依次显示a和b的值,调用swap 函数,a,b作为实参,再在主函数中依次显示a和b的值。
(值传递)编写并运行以上程序,分析运行结果,思考值传递中是否会改变实参的值。
(2)创建控制台应用程序项目,修改(1)中程序,使swap函数的参数为两个指向整型的指针,swap函数中交换指针所指向的内容;主函数中调用swap函数,交换整型变量a和b的值。
编写并运行修改后的程序,比较与(1)中程序运行结果的不同之处及原因。
(3)创建控制台应用程序项目,修改(1)中程序,采用引用方式传递函数的参数。
编写并运行修改后的程序,比较与(1)、(2)中程序运行结果的异同以及(2)、(3)程序中改写的难易程度。
int swap1(int x,int y){int temp;temp=x;x=y;y=temp;return 0;} //实参传递函数int swap2(int &x,int &y){int temp;temp=x;x=y;y=temp;return 0;}//形参传递函数int swap3(int *x,int *y){int temp;temp=*x;*x=*y;*y=temp;return 0;}//指针传递函数int main(){int a,b;Console::WriteLine ("plesae input a and b interger:");a=Int32::Parse(Console::ReadLine());b=Int32::Parse(Console::ReadLine());Console::WriteLine ("实参传递函数交换a和b:");Console::WriteLine ("起始a和b:"+a+" "+b);swap1(a,b);Console::WriteLine ("交换后a和b:"+a+" "+b);Console::WriteLine ("-------------------");Console::WriteLine ("形参传递函数交换a和b:");Console::WriteLine ("起始a和b:"+a+" "+b);swap2(a,b);Console::WriteLine ("交换后a和b:"+a+" "+b);Console::WriteLine ("++++++++++++++++");Console::WriteLine ("指针传递函数交换a和b:");Console::WriteLine ("起始a和b:"+a+" "+b);swap3(&a,&b);Console::WriteLine ("交换后a和b:"+a+" "+b);Console::WriteLine ( "%%%%%%%%%%%%%%%%%" );Console::ReadLine();return 0;}2.递归调用.使用递归时,请注意如下原则:a.确认递归能够停止(子程序中至少含有一条非递归的路径);b.把递归限制在一个子程序内;c.留心栈空间;使用递归前,先考虑可否用其他方式编写程序,可能效果更好。
子程序设计实验报告范文精简处理

子程序设计实验报告范文精简处理实验报告是对实验目的、流程、结果和结论等内容的详细描述和总结。
以下是一份精简处理的子程序设计实验报告范文,共计1245字。
#实验报告名称:子程序设计实验##一、实验目的1.熟悉子程序的定义和使用方法;2.掌握子程序设计的基本思路和技巧;3.实践并提高对程序模块化设计的理解和能力。
##二、实验设备和材料-计算机-C语言编程环境##三、实验方法与流程1.根据实验要求,在C语言编程环境中编写一个独立的子程序;2.使用该子程序计算并输出指定的结果;3.程序编写完成后,编译并运行该程序,观察结果是否符合要求。
##四、实验内容1. 设计一个名为`sum`的子程序,接受一个整型数组和数组长度作为参数,计算数组元素之和,并返回该和;2.编写主程序,使用该子程序求解一个整型数组的元素之和;3.输出求和结果,观察是否正确。
##五、实验结果与分析实验中,我们使用了一组测试数据进行验证。
首先,定义一个整型数组`arr`,其中包含5个元素:{1, 2, 3, 4, 5}。
然后,将该数组和数组长度传递给`sum`子程序进行求和操作。
经过运行,我们得到的结果是15,与我们预期的结果一致。
因此,可以判断子程序设计正确,并成功实现了数组元素之和的计算功能。
##六、实验总结通过本次实验,我们成功设计并实现了一个独立的子程序,在主程序中调用该子程序计算了一个整型数组的元素之和。
通过此次实验,我们进一步熟悉了子程序的定义和使用方法,掌握了子程序设计的基本思路和技巧,并提高了对程序模块化设计的理解和能力。
这对于今后的软件开发和编程工作具有重要意义。
##七、实验心得本次实验让我更加深入地理解了子程序设计的重要性和作用。
通过将功能模块化,我们可以方便地组织和管理程序代码,提高代码的复用性和可维护性。
在实际的软件开发中,子程序设计及其正确使用是非常关键的,能够大大提高开发效率和代码的可靠性。
因此,我会继续学习和掌握更多的子程序设计技巧,并应用于未来的编程工作中。
实验报告模板 (1)

A4: CALLSHOW;调用SHOW子程序
INCSI;SI指针自加1
MOVDL,20H;将要输出的字符放入DL
MOVAH,02H;使用AH=02H号功能调用:显示单个字符输出
INT21h;21号中断,启动调用
LOOPA4;循环A4程序段
MOVAH,02H
INT21H
MOVAL,[SI]
ANDAL,0FH;取低4位
CMPAL,0AH;是否是A以上的数
JBC3
ADD AL,07H ;如果是A以上的数,则需要+37H才能得到其显示码
C3:ADDAL,30H ;如果是A以内的数,则只需要+30H就能得到其显示码
MOVDL,AL;显示字符
MOVAH,02H
MOVAX,4C00H;使用AH=4C号系统功能,返回DOS系统
INT21H;启动调用
SHOW PROCNEAR;以下皆为SHOW子程序段,NEAR表示近调用
MOVAL,DS:[SI];将DS段SI偏移地址上的数据转入AL
ANDAL,0F0H;取高4位
SHRAL,4;对AL中数据逻辑右移4位//???
2、(第二小节)
3、(第三小节)
……
三、实验结果:
(所有的实验结果贴图放到一起)
四、实验总结
(认真写出自己在实验中遇到的问题、解决方法,以及实验的体会、收获等)
;A7-2.asm
;用功能调用实现子程序设计
STACK1 SEGMENT STACK;定义堆栈段
DW 256 DUP(?);256个字空间
STACK1 ENDS
MOV[DI],AL;把AL中数据移至目的地址的内存区
北京理工大学汇编实验五实验报告概要

本科实验报告实验名称:子程序设计实验实验五子程序设计实验(设计性实验)一、实验要求和目的1.熟悉汇编语言程序设计结构;2.熟悉汇编语言子程序设计方法;3.熟悉利用汇编语言子程序参数传递方法;4.熟悉汇编语言字符串处理基本指令的使用方法;5.掌握利用汇编语言实现字符串的输入输出程序设计方法;6.掌握数制转换程序实现方法。
二、软硬件环境1、硬件环境:计算机系统windows;2、软件环境:装有MASM、DEBUG、LINK、等应用程序。
三、实验涉及的主要知识A)子程序知识要点:1、掌握子程序的定义语句;过程名PROC [near/far] 过程体RET过程名ENDP2.子程序结构形式一个完整的子程序一般应包含下列内容:1. )子程序的说明部分在设计了程序时,要建立子程序的文档说明,使用户能清楚此子程序的功能和调用方法.说明时,应含如下内容:.子程序名:命名时要名中见意..子程序的功能:说明子程序完成的任务;.子程序入口参数:说明子程序运行所需参数及存放位置;.子程序出口参数:说明子程序运行结果的参数及存放位置;.子程序所占用的寄存器和工作单元;.子程序调用示例;2、)掌握子程序的调用与返回在汇编语言中,子程序的调用用CALL,返回用RET指令来完成。
.段内调用与返回:调用子程序指令与子程序同在一个段内。
因此只修改IP;.段间调用与返回:调用子程序与子程序分别在不同的段,因此在返回时,需同时修改CS:IP。
3.)子程序的现场保护与恢复保护现场:在子程序设计时,CPU内部寄存器内容的保护和恢复。
一般利用堆栈实现现场保护和恢复的格式:过程名PROC[NEAR/FAR]PUSH AXPUSH BX..PUSH DX...POP DX...POP AXRET过程名ENDP4.子程序的参数传递方法1.寄存器传递参数这种方式是最基本的参数传递方式。
2.存储器单元传(变量)递参数这种方法是在主程序调用子程序前,将入口参数存放到约定的存储单元中;子程序运行时到约定存储位置读取参数;子程序执行结束后将结果也放在约定存储单元中。
子程序设计实验报告

子程序设计实验报告子程序设计实验报告1. 实验背景子程序是一种可重复使用的程序代码片段,能够被主程序调用执行。
本次实验旨在通过编写子程序来加深对子程序设计的理解,并能够熟练使用子程序进行程序的模块化设计。
2. 实验目的通过本次实验,我将掌握以下技能:- 理解子程序的概念和作用- 掌握子程序的定义和调用- 理解子程序的参数传递方式- 学会使用子程序进行程序的模块化设计3. 实验内容本次实验涉及三个任务,分别是:1. 编写一个计算两个数之和的子程序2. 编写一个计算阶乘的子程序3. 编写一个计算圆形面积的子程序4. 实验步骤4.1 编写计算两个数之和的子程序首先,我们需要编写一个子程序用来计算两个数之和。
以下是该子程序的代码示例:pythondef add_numbers(num1, num2):sum = num1 + num2return sum上述代码中,我们定义了一个名为`add_numbers`的子程序,该程序接收两个参数`num1`和`num2`,计算它们的和并返回结果。
4.2 编写计算阶乘的子程序接下来,我们需要编写一个子程序用来计算一个数的阶乘。
以下是该子程序的代码示例:pythondef factorial(n):if n <= 1:return 1else:return n factorial(n-1)上述代码中,我们定义了一个名为`factorial`的子程序,该程序接收一个参数`n`,计算`n`的阶乘并返回结果。
我们使用递归的方式实现了阶乘的计算。
4.3 编写计算圆形面积的子程序最后,我们需要编写一个子程序用来计算圆形的面积。
以下是该子程序的代码示例:pythondef calculate_circle_area(radius):pi = 3.14159area = pi radius radiusreturn area上述代码中,我们定义了一个名为`calculate_circle_area`的子程序,该程序接收一个参数`radius`,计算圆形的面积并返回结果。
(实验七)求最大值和最小值实验报告

实验七求最大值和最小值一、实验目的1、学习子程序的定义和调用方法。
2、掌握子程序设计、调试。
二、实验内容对内存中给定的几个无符号字节数,求其最大值和最小值并在数码管上显示。
三、实验程序框图四、实验步骤脱机模式:(1)在P.态下,按SCAL键,然后在内存4000H~4007H中写入任意八个字节的数,按下MON键,返回P状态。
(2)在P.态下,输入2E70,按EXEC键。
(3)数码管显示为:“XX——XX”,最左两位为最大值,最右两位为最小值。
(4)按“系统复位”键,退出运行状态,数码管返回“P。
”状态。
联机模式:(1)在内存4000H~4007H中写入任意八个字节的数,按下MON键,返回P状态。
(2)在PC机和实验系统联机状态下,运行该实验程序,可用鼠标左键单击菜单栏“文件”或工具栏“打开图标”,弹出“打开文件”的对话框,然后打开8kAsm文件夹,点击S7.ASM 文件,单击“确定”即可装入源文件,再单击工具栏中编译,即可完成源文件自动编译、装载目标代码功能,再单击“调试”中“连续运行”或工具图标运行,即开始运行程序。
(3)数码管显示为:“XX——XX”,最左两位为最大值,最右两位为最小值。
(4)按“系统复位”键,退出运行状态,数码管返回“P。
”状态。
五、实验程序清单X:\DICE-8086K3微机原理与接口实验箱CDROM\CODE\86kasm\S7.ASMCODE SEGMENT ;S7.ASM,LOOK FOR MAX & MINASSUME CS:CODEORG 2E70H ;INPUT DATA 4000H--4007HSTART: JMP START0PA EQU 0FF21H ;字位口PB EQU 0FF22H ;字形口PC EQU 0FF23H ;键入口BUF DB ?,?,?,?,?,?data1:db0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h,88h,83h,0c6h,0a1hdb 86h,8eh,0ffh,0ch,89h,0deh,0c7h,8ch,0f3h,0bfh,8FH START0: MOV SI,4000H ;数据首址MOV CX,0008H ;长度CALL MAXMIN ;调用比较大小子程序CALL BUF1 ;最大最小值送显示缓冲区CON1: CALL DISP ;循环调用显示子程序JMP CON1MAXMIN: JCXZ EXIT ;比较结束子程序返回PUSH SI ;压栈PUSH CXPUSH BXMOV BH,[SI] ;取第一个数MOV BL,BH ;保存数据到BLCON2: LODSB ; 取数CMP AL,BH ;比较两数JNA X1 ;小于等于转MOV BH,AL ;BH存大的数JMP X2 ;转X2X1: CMP AL,BL ;比较两数JNB X2 ;大于等于转MOV BL,AL ;BL存小的数X2: LOOP CON2 ;未完继续MOV AX,BX ;POP BX ;出栈POP CXPOP SIEXIT: RET ;返回DISP: MOV AL,0FFH ;显示子程序5msMOV DX,PAOUT DX,ALMOV CL,0DFH ;注释略,见实验六显示程序MOV BX,OFFSET BUFDIS1: MOV AL,[BX]MOV AH,00HPUSH BXMOV BX,OFFSET DATA1ADD BX,AXMOV AL,[BX]POP BXMOV DX,PBOUT DX,ALMOV AL,CLMOV DX,PAOUT DX,ALPUSH CXDIS2: MOV CX,00A0HLOOP $POP CXCMP CL,0FEH ;01HJZ LX1MOV AL,0FFH ;00HMOV DX,PAOUT DX,ALINC BXROR CL,1 ;SHR CL,1JMP DIS1LX1: MOV AL,0FFHMOV DX,PBOUT DX,ALRETBUF1: MOV BH,AHCALL ZHMOV BUF+5,ALMOV BUF+4,AHMOV AL,BHCALL ZHMOV BUF,AHMOV BUF+1,ALMOV BUF+2,17HMOV BUF+3,17HRET;-------------------------------------------------------- ZH: MOV BL,AL ;数据拆送MOV CL,4ROL AL,CLAND AL,0FHMOV AH,ALMOV AL,BLAND AL,0FHRET;------------------------------------------------------- CODE ENDSEND START。
子程序设计实验报告

子程序设计实验报告子程序设计实验报告1. 实验目的本实验旨在让学生通过设计和实现子程序,深入了解子程序的概念、使用方法和设计原则,培养学生的程序设计思维和编程能力。
2. 实验背景子程序是一个独立于主程序的独立程序段,它可以完成特定的任务并返回结果。
子程序可以被主程序调用多次,不仅可以提高程序的可读性和可维护性,还可以节省重复代码的编写和修改时间。
在实际的程序设计中,子程序被广泛应用于各种领域,如算法实现、功能模块划分、错误处理等。
3. 实验内容在这个实验中,我们将设计一个简单的子程序,实现一个猜数字的游戏。
游戏的规则是计算机随机一个1到100之间的整数,用户通过输入猜测的数字,计算机根据用户的猜测给出相应的提示,直到用户猜中为止。
实验要求:- 使用 Python 编程语言实现。
- 设计一个子程序,用于随机数。
- 设计一个子程序,用于接受用户输入并判断是否猜中。
- 设计一个子程序,用于给出猜测结果的提示。
4. 实验步骤4.1 设计子程序:随机数,我们需要设计一个子程序,用于一个1到100之间的整数。
可以使用 Python 的 random 模块中的 randint 函数来实现。
pythonimport randomdef generate_random_number():return random.randint(1, 100)4.2 设计子程序:接受用户输入并判断是否猜中接下来,我们设计一个子程序,用于接受用户输入的猜测数字,并判断是否猜中。
可以使用 Python 的 input 函数来接受用户输入,并使用 if 语句来判断用户猜测的数字是否与的随机数一致。
pythondef get_user_guess():guess = int(input(\。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验5 子程序实验一.实验目的1.掌握主程序与子程序之间的调用关系及调用方法;2.掌握子程序调用过程中近程调用与远程调用的区别;3.掌握通过堆栈转送参数的方法。
4. 掌握多模块程序设计方法二.实验内容1.将BUF开始的10个单元中的二进制数转换成两位十六进制数的ASCII码,在屏幕上显示出来。
要求码型转换通过子程序HEXAC实现,在转换过程中,通过子程序DISP实现显示。
DATAS SEGMENTBUF DB00000111B,00100001B,00100010B,00000011B,00000101B,10000010B,10010011B,00100100B, 11100010B,01010010BCAN DB $-BUF ;定义常量CANDATAS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATASMAIN PROC FAR ;主程序块START:MOV AX,DATASMOV DS,AXMOV CL,10LEA SI,BUFLOOP1: ;调用子程序语句call HEXACcall DISPDEC CANJNZ LOOP1EXIT:MOV AH,4CHINT 21HMAIN ENDPHEXAC PROC NEAR ;二进制转换成十六进制子程序MOV BL,[SI]INC SIRETHEXAC ENDPDISP PROC NEAR ;显示子程序MOV CL,4MOV CH,2MOVE: ;移位语句ROL BL,CLMOV DL,BLAND DL,0FHADD DL,30HCMP DL,'9'JBE PRINTADD DL,07HPRINT:MOV AH,02H ;显示语句INT 21HDEC CHJNZ MOVEMOV DL,' 'MOV AH,02HINT 21HRETDISP ENDPCODES ENDSEND START2.编写一个主程序,从键盘接收若干个字符,然后用远调用的方法,调用子程序统计字符串中字符’b’的个数.子程序的参数是字符串的首地址TABLE,字符串长度N及字符”b”.子程序返回字符"b”的个数.参数传送采用堆栈实现.主程序在子程序返回后,显示字符”b”及其个数(设为一位十六进制数)。
DATA SEGMENTSTR1 DB 0ah,0dh,'PLEASE INPUT YOUR STRING:$'STR2 DB 0ah,0dh,'THE NUMBER OF b is:$'TABLE DB 50, ? ,50 DUP(?),'$'DATA ENDSCODE SEGMENTASSUME CS: CODE, DS: DATASTART:MOV AX,DATAMOV DS,AXLEA DX,STR1MOV AH,9INT 21HLEA DX,TABLEMOV AH,0AHINT 21HLEA SI , TABLEMOV CL, [SI+1]MOV CH, 0INC SIINC SIMOV AL,'b'MOV AH,0PUSH SIPUSH CXPUSH AXCALL FAR PTR CHECKPOP AXMOV CL,ALLEA DX,STR2MOV AH,9INT 21HMOV DL,CLAND DL, 0FHCMP DL,9JBE CANADD DL,7CAN:ADD DL,30HMOV AH,2INT 21HEXIT:MOV AH,4CHINT 21HCODE ENDSSCODE SEGMENTASSUME CS:SCODE CHECK PROC FARPUSH BPMOV BP,SPMOV SI,[BP+10]MOV CX, [BP+8]MOV AX, [BP+6]XOR AH, AH AGAIN:CMP AL,[SI]JNE CAN1INC AHCAN1:INC SILOOP AGAINMOV AL, AHMOV [BP+10],AXPOP BPRET 4CHECK ENDPSCODE ENDSEND START3. 请编写一个程序来实现简单的程序菜单显示。
(采用多模块程序设计方法)显示一个菜单要求用户从下表中选择:(1)HEXAC GAME (对应-->程序1)(2)CHAR STATISTICS PROGRAM(对应-->程序2)(3)PRESS “ESC”TO QUIT用户作出选择1~3时,显示输出要执行操作的名字,如“Your selection is 1,the program will execute HEXAC NUMBER GAME!”然后转向相应的程序去执行,执行结束前进行退出的判断,显示一个提示信息“will you continue program really?(Y:N)”要求用户从键盘键入字符,若是“Y”键,则继续程序的执行,若是“N”键,则返回到菜单。
若用户选择3,要求程序显示提示信息“Please press ESC key to exit!”,并能按要求正确退出。
DATAS SEGMENTOPT DW YIDW ERmenu DB 0DH,0AH,'THE MENU:' ;显示菜单DB 0DH,0AH,'(1)HEXAC GAME' ;对应-->程序1DB 0DH,0AH,'(2)CHAR STATISTICS PROGRAM';对应-->程序2DB 0DH,0AH,'(3)PRESS "ESC" TO QUIT$'BUF DB 00000111B,00100001B,00100010B,00000011B,00000101B,10000010B,10010011B,00100100B, 11100010B,01010010BCAN DB $-BUF ;定义常量CANstr1 DB 0DH,0AH,'Your selection is 1,the program will execute HEXAC GAME!$'str2 DB 0dh,0ah,'Your selection is 2,the program will execute CHAR STATISTICS PROGRAM!$'str3 DB 0DH,0AH,'will you continue program really?(Y:N)$'str4 DB 0DH,0AH,'Please press ESC key to exit!$'TABLE DB 50, ? ,50 DUP(?),'$'char1 db 0ah,0dh,'PLEASE INPUT YOUR STRING:$'char2 db 0ah,0dh,'THE NUMBER OF b is:$'DATAS ENDSCODES SEGMENTMAIN PROC FARASSUME CS:CODES,DS:DATASSTART:MOV AX,DATASMOV DS,AXXOR DI,DIsub bx,bxxor si,siLEA DX,menu ;显示主菜单MOV AH,9INT 21Hmov dl,0dh ;显示回车mov ah,2int 21hMOV DL,0AH ;显示换行MOV AH,2INT 21HMOV AH,1 ;输入选项INT 21HCMP AL,'1'JE YICMP AL,'2'JE ERCMP AL,'3'JE QUITYI: MOV DI,0lea dx,str1mov ah,9int 21hMOV CL,10LEA SI,BUFCALL HEXACLOOP1: ;调用子程序语句call HEXACcall DISPDEC CANJNZ LOOP1JMP CONTINUEER: MOV DI,02Hlea dx,str2mov ah,9int 21hLEA DX,char1MOV AH,9INT 21HLEA DX,TABLEMOV AH,0AH ;输入字符串INT 21HLEA SI , TABLEMOV CL, [SI+1]MOV CH, 0 ;CX中为字符串长度INC SIINC SI ;SI指向串首址TABLEMOV AL,'b'MOV AH,0 ;AX中为待查字符PUSH SIPUSH CXPUSH AX ; 参数送堆栈CALL CHECKPOP AX ;统计个数在AL中MOV CL,ALLEA DX,char2 ;显示结果MOV AH,9INT 21HMOV DL,CLAND DL, 0FHCMP DL,9JBE CAN3ADD DL,7CAN3:ADD DL,30HMOV AH,2INT 21H ;显示统计个数JMP CONTINUEQUIT:LEA DX,str4 ;退出的子程序MOV AH,9INT 21HMOV AH,1INT 21HCMP AL,1BH ;按ESC退出JE EXITCONTINUE:LEA DX,str3 ;用户是否继续执行当前程序MOV AH,9INT 21HMOV AH,1INT 21HCMP AL,'Y' ;按y继续,按n退出,不需区分大小写JE YESCMP AL,'y'JE YESCMP AL,'N'JE STARTCMP AL,'n'JE STARTYES: JMP opt[DI] ;继续运行当前子程序EXIT:MOV AH,4CH;退出INT 21HMAIN ENDPCODES ENDSHEXACCODES SEGMENTASSUME CS:HEXACCODESHEXAC PROC FAR ;二进制转换成十六进制子程序MOV BL,[SI]INC SIRETHEXAC ENDPHEXACCODES ENDSDISPCODES SEGMENTASSUME CS:DISPCODESDISP PROC FAR ;显示子程序MOV CL,4MOV CH,2MOVE: ;移位语句ROL BL,CLMOV DL,BLAND DL,0FHADD DL,30HCMP DL,'9'JBE PRINTADD DL,07HPRINT:MOV AH,02H ;显示语句INT 21HDEC CHJNZ MOVEMOV DL,' 'MOV AH,02HINT 21HRETDISP ENDPDISPCODES ENDSCHARCODE SEGMENTASSUME CS: CHARCODE ;子程序部分CHECK PROC FARPUSH BPMOV BP,SPMOV SI,[BP+10]MOV CX, [BP+8]MOV AX, [BP+6]XOR AH, AHAGAIN:CMP AL,[SI]JNE CAN1INC AHCAN1:INC SILOOP AGAINMOV AL, AHMOV [BP+10],AXPOP BPRET 4CHECK ENDPCHARCODE ENDSEND START三.实验要求1.第一个实验程序用子程序的近程调用实现。