实验四 子程序设计

合集下载

微机原理与技术实验四:子程序结构

微机原理与技术实验四:子程序结构

微机原理与技术实验四: 子程序结构实验四:子程序设计一、实验目的:掌握子程序结构, 熟悉汇编上机环•='二、实验内容: 设有数组SCORE存放学生的成绩(0-100分),编写一个子程序统计0~59分、60〜69分、70〜79分、80〜89分、90〜100分的人数,并分别存放到SCOREE. SCORED、SCOREC、SCORERSCOREA 单元中。

编写一个主程序与之配合使用。

二、实验步骤:1、在“轻松汇编”环境下编写、编译和生成程2、进入DEBUG界面,运行程序,观察SCOREE、SCORED> SCOREC、SCORED> SCOREA变量的值是否正确:在DEBUG下运行程序:F9键观察多个变量值:“Data” 9 “Add Watch” 今“输入变量1"“Data” 9 “Add Watch”今“输入变量2”DATA SEGMENTSCOREDB 80,78,45,81,90,72,60,75SCOREE DBSCORED DBSCOREC DBSCORED DBSCOREA DBDATA ENDSSTCK SEGMENTDB 10 DUP(?)STCK ENDSCODE SEGMENTASSUMECS:CODE,DS:DATA,SS:STCKSTART:;以下为子程序COUNT PROC补全程序RET COUNT ENDP CODE ENDSMOV INTAH ,4CH 21H五、实验小结说明:实验报告要包涵上述五项DATA SEGMENTSCORE DB 80,7&45,81,90,72,60,75SCOREE DB 0SCORED DB 0SCOREC DB 0SCORER DB 0SCOREA DB 0DATA ENDSSTCK SEGMENTDB 10 DUP(?)STCK ENDSCODE SEGMENTASSUMECS:CODE,DS:DATA,SS:STCKSTART:MOV AX,DATAMOV DS,AXLEA SI,SCOREMOV CX,8Al: CALLINCCOUNT SIDEC CXCMP CX,OJNZ AlMOV AH,4CHINT 21HCOUNT PROCMOV AL,[SI]CMP AL,90JNB A2CMP AL,80JNB A3CMP ALJOJNB A4CMP AL,60JNB A5INC SCOREERETA2: INC SCOREARETA3: INC SCORERRETA4: INCRETA5: INCRETCOUNT ENDP CODE ENDSEND SCOREC SCOREDSTART。

子程序实验报告

子程序实验报告

一、实验目的1. 理解子程序的概念和作用。

2. 掌握子程序的编写方法和调用方式。

3. 学会使用子程序实现模块化编程,提高程序的可读性和可维护性。

二、实验环境1. 操作系统:Windows 102. 编译器:Visual Studio 20193. 编程语言:C++三、实验内容1. 子程序的定义与调用2. 子程序的参数传递3. 子程序的递归调用4. 子程序的应用实例四、实验步骤1. 子程序的定义与调用(1)编写一个简单的子程序,实现两个整数的加法运算。

```cpp#include <iostream>using namespace std;// 定义子程序int add(int a, int b) {return a + b;}int main() {int a = 10;int b = 20;int sum = add(a, b); // 调用子程序cout << "The sum of " << a << " and " << b << " is " << sum << endl; return 0;}```(2)编译并运行程序,观察输出结果。

2. 子程序的参数传递(1)编写一个子程序,实现两个整数的交换。

```cpp#include <iostream>using namespace std;// 定义子程序void swap(int &a, int &b) {int temp = a;a = b;b = temp;}int main() {int a = 10;int b = 20;cout << "Before swap: a = " << a << ", b = " << b << endl;swap(a, b); // 调用子程序cout << "After swap: a = " << a << ", b = " << b << endl;return 0;}```(2)编译并运行程序,观察输出结果。

子程序程序设计范文

子程序程序设计范文

子程序程序设计范文子程序程序设计有许多优点,包括提高代码的可读性、可维护性和可重用性。

它使程序员能够将程序分成小块,从而更容易理解和修改代码。

此外,一旦编写了子程序,它可以在程序的不同部分被多次调用,从而减少代码的重复性。

在子程序程序设计中,有两种类型的子程序:函数和过程。

函数是一种子程序,接受输入参数,执行一系列操作,并返回一个结果。

它可以被赋值给一个变量或直接使用。

函数通常被用于计算和返回值。

以下是一个示例函数,用于计算两个数的和:```pythondef sum(a, b):return a + b```过程是一种子程序,不返回结果,而是执行一系列操作或修改全局变量。

过程通常用于执行一些特定的任务,而不需要任何返回值。

以下是一个示例过程,用于打印表格中的数据:```pythondef print_table(data):for row in data:for item in row:print(item, end='\t')print```参数可以是按值传递或按引用传递。

按值传递是指将参数的值复制到子程序的局部变量中。

在子程序中修改局部变量的值不会影响原始变量的值。

按引用传递是指将参数的引用传递给子程序,使得它可以修改原始变量的值。

以下是一个示例函数,用于计算两个数的商。

如果除数为0,则引发一个异常:```pythondef divide(a, b):if b == 0:raise ValueError("除数不能为0")return a / b```调用者可以使用try-except语句捕获和处理该异常:```pythontry:result = divide(10, 0)except ValueError as e:print("发生错误:", e) ```。

第5章4 子程序设计

第5章4 子程序设计
X,1000H GOON: INC AX LOOP GOON RET DELAY ENDP Code ends end start
由于主程序和子程序具有相互独立性,而CPU 中的寄存器是公用的,所以它们在使用寄存器时会 发生冲突,即:如果主程序在调用子程序之前的某 一寄存器中的内容在从子程序返回后还有用,而子 程序又恰好使用了此寄存器,这样就会破坏寄存器 中原有的内容,从而造成在返回主程序时程序因数 据的丢失而出现错误。
在设计一个子程序之前,首先应该明确: 子程序的名字; 子程序的功能; 入口参数:为了运行这个子程序,主程序为它准备了哪几个 “已知条件”?这些参数存放在什么地方? 出口参数:这个子程序的运行结果有哪些?存放在什么地方? 影响寄存器:执行这个子程序会改变哪几个寄存器的值? 其它需要说明的事项。
BX,OFFSET X SI, OFFSET ROOT
;初始化指针
MOV
ONE: MOV
CX, 5
AX, [BX]
;设置计数器初值
;设置入口参数 ;调用子程序
CALL SQUARE
MOV
ADD INC
[SI], AL
BX, 2 SI
;保存返回参数(平方根)
;修改指针 ;修改指针
LOOP ONE
JMP $ CODE ENDS
• • • • • • • • • • • • • • • • • •
change proc cmp ah,90 jb m1 mov al,'A' jmp exit m1: cmp ah,80 jb m2 mov al,'B' jmp exit m2: cmp ah,60 jb m3 mov al,'C' jmp exit m3: mov al,'D' exit: ret change endp code ends end start

汇编实验报告--子程序设计实验

汇编实验报告--子程序设计实验

实验五子程序设计实验学生姓名:何茂杰学号:2010305104 专业班级:计算机本科一班指导老师:文远熔实验日期:实验成绩:一、实验目的1.掌握主程序与子程序之间的调用关系及调用方法;2.掌握子程序调用过程中近程调用与远程调用的区别;3.掌握通过堆栈转送参数的方法。

二、实验内容1.将BUF开始的10个单元中的二进制数转换成两位十六进制数的ASCII码,在屏幕上显示出来。

要求码型转换通过子程序HEXAC实现,在转换过程中,通过子程序DISP实现显示。

三、实验环境PC微机DOS操作系统或Windows 操作系统四、实验要求1.第一个实验程序用子程序的近程调用实现。

由于在调用HEXASC子程序时,子程序又调用了DISP子程序,这叫子程序的嵌套调用。

实验过程中可以从堆栈的内容看到两个子程序的返回地址值。

由于是近调用,地址值只包括返回地址的段内偏移量。

在每个子程序的执行中,检查CS值是不变的。

2.预习子程序设计的基本方法,根据实验内容要求,画出子程序及主程序的流程图;熟悉键盘键入字符串及用堆栈传送参数的程序段编制方法。

五、主要实验步骤1.编辑、汇编两个源程序,生成相应的可执行文件(.EXE)2.用DEBUG的R命令,T命令或G命令和D命令检查远程调用及近程调用时堆栈的变化。

特别是通过堆栈传送的参数和子程序取出的参数是返回参数的详细过程。

3.检查程序执行的结果是否正确。

六.实验结果:七.心得体会了解了把BUF开始的10个单元中的二进制数转换成两位十六进制数的ASCII码源代码:.MODEL SMALL.336.STACK 200H.DA TAAS CV AL DB ‘12345’BINV AL DW ?.CODEMAIN PROCSTART:MOV AX,@DA TAMOV DS,AXLEA BX ASCV ALPUSH BXLEA BX,BINV ALPUSH BXCALL CONV ASCBINMOV AX,4C00HINT 21HMAIN ENDPCONV ASCBIN PROCPUSH BPMOV BP,SPADD SP AXPUSH AXPUSH BXPUSH CXPUSH SIPUSH DIMOV BX,0AHMOV SI,[BP+6]MOV DI,[BP+4]SUB DI,SIMOV [BP-2],DIMOV CX,[BP-2]ADD SI,[BP-2]DEC SIMOV WORDE PTR[BP-4],0001MOV DI,[BP+4]MOV WORD PTR[DI],0 NEXT:MOV AL,[SI]AND AX,000FHMUL WORD PTR[BP-4]ADD [DI],AXMOV AX,[BP-4]MUL BXMOV [BP-4],AXDEC SILOOP NEXTPOP DIPOP SIPOP CXPOP BXPOP AXMOV SP,BPPOP BPRET 0004CONV ASCBIN ENDPEND MAIN。

实验的四子程序设计

实验的四子程序设计

实验四子程序设计一.实验目的:1.进一步掌握子程序设计方法;2.进一步掌握基本的DOS 功能调用.二.实验内容:1.从键盘上输入某班学生的某科目成绩.输入按学生的学号由小到大的顺序输入.2.统计检查每个学生的名次.3.将统计结果在屏幕上显示.4.为便于观察,输入学生数目不宜太多,以不超过一屏为宜.输出应便于阅读.尽可能考虑美观.5.输入要有检错手段.三、创新功能:1、监测不合法输入,当输入字符不为数字时,报错'Input illegal!'。

且允许用户从将当前错误数据重新输入,不必整体重新输入。

2、根据实际情况按百分制换算,当输入为3位数时自动结束读取,且最高分可限定为100分,例如输入999,排名时按照100分计算。

3、允许相同成绩的同学存在,不会影响排名。

4、允许输入的学生数任意,只要不超过堆栈空间均可。

5、输入输出界面友好,用户可以直观地看到名次表,对应学生学号和成绩。

6、利用堆栈空间,存储结构优越7、程序采用模块化设计,将实现相同功能的代码聚为宏块或子函数四.预习题:1.如何确定一个学生在这门科目中的名次?答:对成绩降序排序,同时记录学号2.你觉得输入结束后,采用什么方法进行比较以得到学生的名次最为简单?答:每次查找出当前最小成绩和其所对应学号入栈,这样形成的栈栈顶为最高分,弹栈时可依次降序输出成绩和对应学号,即为名次表。

3.准备好模块层次图.答:见下面流程图4.给出输出显示的形式.按顺序输入12个学生成绩:100、67、88、89、93、50、6、21、77、77、56、95,按ctrl+z 输入结束运行结果为:五、代码分析CHG MACRO X;将数字转换成ASCII码的宏块PUSH AXPUSH BXMOV AX,XMOV BL,10DIV BLADD AL,'0'ADD AH,'0'MOV BH,ALMOV BL,AHMOV X,BXPOP BXPOP AXENDMPRESENT MACRO X;显示单个字符的宏块MOV AH,02HMOV DL,XINT 21HENDMSTR MACRO STRING;显示字符串宏块MOV AH,09HMOV DX,SEG STRINGMOV DS,DXLEA DX,STRINGINT 21HENDMINPUT MACRO;输入单个字符宏块MOV AH,01HINT 21HENDMDATA SEGMENTBUFF DB 100 DUP(0);存入输入数据STRING1 DB 0DH,'Input illegal!','$' STRING2 DB 'score of stu ','$'STRING3 DB '100','$'STRING4 DB 'NO.','$'STRING5 DB 'The final rank is:','$' STRING6 DB ' STU:','$'STRING7 DB ' SCORE:','$'NUM DW 1;存入学生人数NUM2 DW 1P DW 1COUNT DB 0;计数成绩位数COUNT1 DW 1DATA ENDSSTACK SEGMENT 'STACK'DB 300 DUP(?)STACK ENDSCODE SEGMENTASSUME DS:DATA,CS:CODE,SS:STACK START: MOV DX,SEG DATAMOV DS,DXLEA SI,BUFF;输入模块LOOP1: MOV BH,'0'MOV BL,'0'STR STRING2MOV CX,NUM;移入CX进行转换显示CHG CX;将当前学号变为ASCIIPRESENT CHPRESENT CLPRESENT ':'L3: INPUTCMP AL,26;输入是否结束JZ EXICMP AL,0DHJNZ L1L2: INC NUM;输入结束CMP COUNT,1JZ Y1MOV [SI],BH;存成绩!!!!!!!!!MOV [SI+1],BLJMP Y2Y1: MOV BYTE PTR [SI],'0';当输入为一位数时,高位写0 MOV [SI+1],BHY2: INC SIINC SIMOV COUNT,0;计数变量清零PRESENT 0DHPRESENT 0AHJMP LOOP1L1: CALL JUDGECMP DL,0JNZ LOOP1;不合法重新输入INC COUNT;合法代表已经输入了一位数CMP COUNT,1JNZ CNT2MOV BH,AL;输入第一位数JMP L3CNT2: CMP COUNT,2;输入第二位数JNZ CNT3MOV BL,ALJMP L3CNT3: MOV BH,40HMOV BL,40HJMP L2;输入三位数代表当前输入结束;排序模块EXI: DEC NUMMOV AX,NUMMOV NUM2,AX;存起来NUM输入的个数LEA SI,BUFFMOV BH,40H;最小数MOV BL,40HMOV DX,NUM;待比较的数的个数LOOP2: CMP NUM,0JZ WALILOOP3: MOV CL,[SI];当前待比较单元送人SICMP CL,'!';是否为空单元JZ PLUSS;是则判断下一个CMP CL,BH;判断高位JA PLUSS;大于最小数,跳转判断下一个JB IMOV CL,[SI+1];判断低位CMP CL,BLJA PLUSS;大于最小数,跳转判断下一个I: MOV BH,[SI];更新最小值MOV BL,[SI+1]MOV DI,SI;存最小值的指针PLUSS: INC SI;判断下一个数INC SIDEC DX;还剩DX个数需要比较CMP DX,0JNZ LOOP3PUSH BX;跳出循环一轮比较完毕LEA SI,BUFF;SI重新指向待比较的数组首位PUSH CXMOV CX,DISUB DI,SI;记录最小值是第几个学生MOV AX,DI;存下二者差值MOV BL,2DIV BL;得到实际的学号偏移MOV DI,CXPOP CXMOV P,AXINC PCHG P;将学号转换为ASCII码入栈PUSH P;学号入栈MOV BYTE PTR [DI],'!';入栈后相应位置置入特殊符号,下次读取到此符号可不进行判断MOV BYTE PTR [DI+1],'!'DEC NUM;待入栈的变量-1MOV DX,NUM2MOV BH,40H;保证每次寻找最小值前BH、BL中内容为最大值MOV BL,40HJMP LOOP2;显示模块WALI: PRESENT 0DHSTR STRING5PRESENT 0DHPRESENT 0AHAGAIN: MOV CX,NUM2CMP CX,0;是否栈空JNZ GOONENDD: MOV AX,4C00HINT 21HGOON: STR STRING4MOV CX,COUNT1CHG CXPRESENT CHPRESENT CLPRESENT ':'POP CX;学号弹栈STR STRING6PRESENT CH;输出学号PRESENT CLPRESENT 20HSTR STRING6POP CX;成绩弹栈STR STRING7CMP CH,40H;是否是满分JZ NEAR PTR FULPRESENT CH;非满分显示分数的高低位PRESENT CLLINE: PRESENT 0DHPRESENT 0AHDEC NUM2INC COUNT1JMP AGAINFUL: PRESENT '1';满分直接显示100PRESENT '0'PRESENT '0'JMP LINEJUDGE PROC;判断输入是否合法,合法则DL=0不合法修改DL=1且输出字符串提示MOV DL,0CMP AL,'0'JNB NEXT1W1: STR STRING1MOV DL,1JMP OVNEXT1: CMP AL,'9'JA W1OV: RETJUDGE ENDPCODE ENDSEND START23、输出模块流程图:七、程序设计思路与总结本实验主要联系了宏块和子程序调用,属于排序问题。

实验四、子程序设计

实验四、子程序设计
实验(四) 子程序设计
1、上机题目:代码转换 内容:用子程序设计的方法,分别把BUF字单元中 的四个十六进制数转换为ASCII代码存入MAS开始 的单元中,并在crt上显示。 BUF DW X MAS DB 4 DUP(?) 要求:熟练掌握子程序设计方法
主程序
开始 数据段: 数据段: 变量定义 段加载
Decbin子程序 子程序
现场保护
Al<0a? n al ←al+7 al ←al+30 Mas[si]←al
crt 显示
y
si←0 ch←4h cl←4h
call decbin end
ax ←buf ax← ax rol cl buf ←ax
取 aln Ch-1=0? y
恢复现场
ret
2、上机题目: 内容:用子程序设计的方法,从键盘输入2 位16进制数,并在屏幕上以10进制数显示. 要求:熟练掌握子程序设计方法

项目四子程序调用功能

项目四子程序调用功能

03
优化。
多线程与异步编程
在多线程或异步编程环境中,子程序调 用可以用于实现任务的并行处理和异步 执行。
通过子程序调用,可以将复杂的任务分解为 多个简单的子任务,并由不同的线程或进程 执行,提高程序的执行效率和响应速度。
子程序调用可以简化多线程和异步 编程的逻辑,降低并发编程的难度 和错误率。
05
通过指针传递参数,子程序可以通过指针直接修改原 始数据。
返回值处理
返回值使用
子程序执行完毕后,返回一个或多个值给调用者。
错误码处理
子程序可以设置错误码,通过返回错误码告知调用者执行结果是否成功。
错误处理机制
异常处理
子程序在执行过程中遇到错误时,可以抛出异常给调用者处理。
错误码处理
子程序可以设置错误码,通过返回错误码告知调用者执行结果是否成功。
子程序优化策略
减少函数调用次数
通过减少函数调用次数,提高代码执行效率。
使用内联函数
将函数体直接嵌入到调用处,避免函数调用 的开销。
避免重复计算
将重复计算的结果存储在变量中,避免重复 计算。
03
子程序调用的实现方式
函数调用
总结词
函数调用是一种常见的子程序调用方式,它将子程序作为一个独立的实体进行调用,可以重复使用和 重定义。
03
在编写子程序时,应考虑线程安全问题,并采取相应
的预防措施。
优化子程序性能
01
子程序的性能对整个项目的性 能有很大影响。
02
应优化子程序的算法和数据结 构,以提高执行效率。
03
使用性能分析工具来识别子程 序的瓶颈,并进行针对性的优 化。
THANKS FOR WATCHING
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据分析并记录
3)根据上机操作进行记录(模仿实验三设计本实验执行情
况表格并记录)
表一
寻找最大数执行情况表 (实三)
DS:0000 DS:0001 DS:0002 1234H 5678H 2597H
SUM 8E43H
编写实验报告
子程序设计
6、实验报告要求(见附录)
1)实验报告要求有实验目的、要求、设备或仪 器、程序设计、步骤、数据分析。数据分析填 在报告本的原始数据栏。 2)画出实验内容1)2)程序设计流程图、写出程 序清单并有简要注释。 3)写出实验过程中所遇到的问题与解决的办法。
实验设备 仿真软件使用
子程序设计 d. 对原程序进行汇编与链接,通过观察输出 窗口的信息,确定对汇编程序的修改。有错误, 进行修改,随即汇编与链接,直到无错误为止, 形成 *.exe可执行的文件。 e. 在调试界面中采用不同方式调试程序(采用 单步、连续等运行方式,调试程序),通过 “vars”功能,观察符号变量数据变化。查 看????单元中的内容。
1)多数求和程序设计(求和部分使用子程序) 。 2) N!(N=6)计算程序设计。
2、实验目的
了解子程序结构,掌握其编程与调试方法
实验设备 仿真软件使用
子程序ቤተ መጻሕፍቲ ባይዱ计
3、实验设备与仪器
PC机、emu8086仿真软件。
4、实验步骤
a. 检查实验设置外接电源,开启PC机。 b. 进入软件集成操作环境主界面,按NEW建立新 文件,即可开始输入源程序。 c. 输入程序后,按Ctrl+S保存程序(规定扩展 名为 *.asm源程序文件)。
数据分析并记录
子程序设计
5、程序设计
1)工作原理 子程序又称过程,由过程伪操作指令PROC定 义开始,ENDP定义结束,属性可以是NEAR或FAR。 与主程序在同一代码段中的子程序使用NEAR属性, 与主程序不在同一代码段中的子程序使用FAR属 性。
上机操作开发汇编程序
2)参考程序(多数求和-子程序)
微机原理与应用
实验四、子程序设计
实验重点:理解子程序结构,调试该结构程序,数据分析 实验难点:编写子程序
子程序设计 具体做的事情: * 实验内容理解(包括实验目的) * 了解子程序结构、编写方法 * 上机实践熟悉汇编语言程序开发过程及调试方法 * 数据分析并记录
* 编写实验报告
子程序设计
1、实验内容
DATA SEGMENT NUM DW 3 DUP(?) SUM DW ?,? DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX LEA BX,NUM CALL ADDSUM MOV SUM,CX MOV SUM+2,DX MOV AH,4CH INT 21H ADDSUM PROC NEAR MOV CX,0 ADD CX,[BX] ADD CX,[BX+2] MOV DX,0 ADC DX,0
附录
编写实验报告
相关文档
最新文档