实验四 子程序设计
微机原理与技术实验四:子程序结构
微机原理与技术实验四: 子程序结构实验四:子程序设计一、实验目的:掌握子程序结构, 熟悉汇编上机环•='二、实验内容: 设有数组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 子程序设计
由于主程序和子程序具有相互独立性,而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在计算机编程的广袤世界中,子程序设计就如同建筑中的基石,虽看似细微,却对整个程序的结构和性能起着至关重要的作用。
子程序,简单来说,就是一段可以被独立调用和执行的代码块。
它就像是一个功能明确的小工具,在需要的时候被拿出来使用,完成特定的任务。
想象一下,你正在编写一个复杂的程序,比如一个大型的游戏或者一个企业级的管理系统,如果所有的代码都混在一起,那将会是一团乱麻,难以理解和维护。
而子程序的出现,就将这团乱麻梳理得井井有条。
子程序设计的第一步,是明确它的功能。
这就好比你要制造一个工具,首先得清楚这个工具是用来做什么的。
是用于数据处理、计算、还是控制流程?只有明确了功能,才能为后续的设计打下坚实的基础。
比如,我们要设计一个子程序来计算两个数的和,那么它的功能就是接收两个数作为输入,并返回它们的和作为输出。
在确定了功能之后,接下来要考虑的就是参数的设计。
参数就像是子程序的“接口”,通过这些接口,外部的代码可以与子程序进行交互。
参数的设计要合理,既要满足功能的需求,又不能过于复杂。
如果参数过多或者不合理,使用子程序的人就会感到困惑,甚至可能会用错。
还是以计算两个数的和为例,我们只需要两个参数,分别代表要相加的两个数。
然后就是子程序内部的实现。
这就像是在打造工具的内部结构,需要选择合适的算法和数据结构来实现预定的功能。
在这个过程中,要考虑代码的效率和可读性。
效率意味着程序能够快速地完成任务,而可读性则保证了其他人能够轻松地理解你的代码。
比如,在计算两个数的和时,我们可以直接使用加法运算符来实现,代码简洁明了。
设计好子程序之后,还需要进行测试。
测试就像是对工具的检验,确保它能够正常工作,并且在各种情况下都能给出正确的结果。
我们可以输入不同的参数值,检查子程序返回的结果是否符合预期。
如果发现问题,就需要及时进行调试和修改。
除了基本的功能实现,良好的子程序设计还需要考虑一些其他的因素。
比如错误处理,当输入的参数不符合要求或者在计算过程中出现异常情况时,子程序应该能够给出恰当的错误提示,而不是直接崩溃。
实验4 顺序结构程序设计
河北工业大学城市学院《汇编语言程序设计》实验报告实验4 顺序结构程序设计一、实验目的1.掌握汇编语言集成开发环境下编写完整汇编程序的书写方法。
2.掌握汇编语言集成开发环境下汇编程序的汇编、连接、执行和调试。
3.常用伪指令的使用。
4. 掌握顺序结构程序的编写方法。
二、实验内容1.从键盘输入一个大写字母,将其转换为小写字母并显示在屏幕上解:程序代码为:DATAS SEGMENTDATAS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS START:MOV AX,DATASMOV DS,AXMOV AH,1;功能号为1,键盘输入单字符并回显INT 21HADD AL,32MOV DL,ALMOV AH,2;功能号为2,显示输出单字符INT 21HMOV AH,4CHINT 21HCODES ENDSEND START运行结果如图所示:2.在内存X和Y单元各存放了一个非压缩BCD码,将它们组合为压缩BCD码并存于Z单元(高地址做高位)。
解:程序代码为:DATAS SEGMENTX DB 00000101BY DB 00000110BZ DB?DATAS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS START:MOV AX,DATASMOV DS,AXMOV CL,4SHL X,CLMOV CL,YOR CL,XMOV Z,ALMOV AH,4CHINT 21H CODES ENDSEND START运行结果如图所示:3.在内存TAB开始的16个单元连续存放了0-15的平方值(0-225),任给一个数X(0 ≤X ≤15),求X的平方值,并把结果存放在Y单元中。
解:程序代码为:DATAS SEGMENTTAB DB 0,1,4,9,16,25,36DB 49,64,81,100,121DB 144,169,196,225X DB 6Y DB? DATAS ENDS CODESSEGMENTASSUME CS:CODES,DS:DATAS START:MOV AX,DATASMOV DS,AXLEA BX,TABMOV AL,XMOV AH,0ADD BX,AXMOV AL,[BX]MOV Y,ALMOV AH,4CHINT 21H CODES ENDSEND START。
华工微机原理实验四子程序设计实验报告
华南理工大学微机原实验四:子程序设计一.实验目的1、学习子程序的定义和调用方法。
2、掌握子程序、子程序嵌套的结构。
3、掌握子程序的程序设计、编制及调试方法。
二.实验内容程序采用菜单式选择,可接收用户输入的命令(1~5),各命令如下:按1键完成字符串小写字母变大写字母用户输入一由英文大小写字母或数字0~9组成的字符串(以回车结束),程序逐个检查字符串中各字符,将原串中小写字母变成大写字母,其它字符不变,并在屏幕上显示。
用户按任一键,重做,按ESC键,返回主菜单。
按2键完成找最大值(二选一)1、接收用户输入的可显示字符串(以回车结束),程序将其中ASCII码值最大的字符显示出来。
2、接收用户输入若干无符号8位数(以空格或逗号为分隔符,以回车结束),程序将其中最大的数显示出来。
用户按任一键,重做,按ESC键,返回主菜单。
按3键完成排序(二选一)1、接收用户输入的可显示字符串,以回车结束。
程序按ASCII码值大小由大到小排序并输出显示。
2、接收用户输入若干个有符号8位数(以空格逗号为分隔符,以回车结束)。
程序将其中最大的数显示出来。
用户按任一键,重做,按ESC键,返回主菜单。
按4键显示时间首先提示用户对时,即用户输入时,分,秒(以空格或冒号分隔,以回车结束),然后,在屏幕上不断显示时间,格式为:××(时):××(分):××(秒),最好定点显示。
用户按任一键,重新对时,按ESC键,返回主菜单。
按5键,结束程序运行,返回系统提示符。
三.程序与流程图主程序的简略流程子程序一的简略流程图子程序二的简略流程图子程序三的简略流程图子程序4,显示时间流程图四、源程序代码DATA SEGMENTORG9999HMENU DB0DH,0AH,'Programed by Deng Tengfei Class Electronic Material Grade 09',0DH,0AH,;菜单DB'Please input1~5to choose service',0DH,0AH,DB'1:Convert a small letter to a big letter',0DH,0AH,DB'2:Seek the bigest number',0DH,0AH,DB'3:Put the character string in order',0DH,0AH,DB'4:Set time and check time',0DH,0AH,DB'5:End the program$'MEG0DB'Please choose function$';提示信息MEG0~MEG8MEG1DB'You have choose the function1.',0DH,0AH,'Please input the character string you want to convert:$'MEG2DB'You have choose the function2.',0DH,0AH,'Please input the character string:$'MEG3DB'You have choose the function3.',0DH,0AH,'Please input the character string you want to sort$'MEG4DB'You have choose the function4.',0DH,0AH,'Please input the time you want to set in format like:xx:xx:xx$'MEG5DB'The program is end$'MEG6DB'Sorry.you have chosen a undefined function.Please input a correct function number$' MEG7DB'Fail to set time$'MEG8DB'Press any key to do again or press the ESC key to return to the main menu$'FLAG DB-1;冒泡排序中使用的标志DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATAMAIN PROC NEAR;主程序MOV AX,DATAMOV DS,AXCIN:LEA DX,MENU;输出提示信息MOV AH,09HINT21HCALL ENT;输出回车换行LEA DX,MEG0MOV AH,09HINT21HCALL ENTMOV AH,01HINT21HCMP AL,30H;判断功能号JLE EORCMP AL,31HJE F1CMP AL,32HJE F2CMP AL,33HJE F3CMP AL,34HJE F4CMP AL,35HJE F5EOR:CALL ENTLEA DX,MEG6;输出出错信息MOV AH,09HINT21HJMP CINF1:CALL ENT;功能1LEA DX,MEG1MOV AH,09HINT21HCALL ENTCALL FUN1;调用子程序1MOV AH,01HINT21HCMP AL,1BHJNE F1JMP CINF2:CALL ENT;功能2LEA DX,MEG2MOV AH,09HINT21HCALL ENTCALL FUN2;调用子程序2MOV AH,01HINT21HCMP AL,1BHJNE F2JMP CINF3:CALL ENT;功能3LEA DX,MEG3MOV AH,09HINT21HCALL ENTCALL FUN3;调用子程序3MOV AH,01HINT21HCMP AL,1BHJNE F3JMP CINF4:CALL ENT;功能4LEA DX,MEG4MOV AH,09HINT21HCALL ENTCALL FUN4;调用子程序4MOV AH,01HINT21HCMP AL,1BHJNE F4JMP CINF5:MOV AH,4CH;功能5,终止程序INT21HFUN1PROC NEAR;子程序1PUSH AXPUSH CXPUSH DXPUSH SIMOV AH,0AH;字符串输入INT21HCALL ENTMOV SI,DXINC SIMOV CL,[SI];设定循环次数MOV CH,0JIK:INC SIMOV AL,[SI]CMP AL,0DH;判断字符ASCII码JE KLCMP AL,61HJB JKCMP AL,7AHJA JKSUB AL,20H;小写转大写JK:MOV DL,AL;输出字符MOV AH,02HINT21HLOOP JIKCALL ENTLEA DX,MEG8MOV AH,09HINT21HKL:POP SIPOP DXPOP CXPOP AXRETFUN1ENDPFUN2PROC NEAR;子程序2PUSH AXPUSH CXPUSH DXPUSH SIMOV AH,0AHINT21HCALL ENTMOV SI,DXINC SIMOV CL,[SI]MOV CH,0INC SIMOV AL,[SI]FH:INC SI;循环比较CMP AL,[SI]JA FGMOV AL,[SI]FG:LOOP FHMOV DL,ALMOV AH,02HINT21HCALL ENTLEA DX,MEG8MOV AH,09HINT21HPOP SIPOP DXPOP CXPOP AXRETFUN2ENDPFUN3PROC NEAR;子程序3PUSH AXPUSH BXPUSH CXPUSH DXPUSH SIPUSH DIMOV AH,0AHINT21HCALL ENTMOV SI,DXINC SIMOV BL,[SI]MOV BH,0INC SIMOV DI,SILP1:CMP FLAG,0;根据标志判断JE LP3DEC BX;检查循环次数CMP BX,0JE LP3MOV CX,BXMOV SI,DIMOV FLAG,0LP2:MOV AL,[SI];前后比较CMP AL,[SI+1]JLE NEXTXCHG AL,[SI+1]MOV[SI],ALMOV FLAG,0FFHNEXT:INC SILOOP LP2;内循环继续JMP LP1;退出内循环LP3:DEC DI;重新设定循环次数MOV CL,[DI]MOV CH,0LP4:INC DI;循环输出字符MOV DL,[DI]MOV AH,02HINT21HLOOP LP4CALL ENTLEA DX,MEG8MOV AH,09HINT21HPOP DIPOP SIPOP DXPOP CXPOP BXPOP AXRETFUN3ENDPFUN4PROC NEAR;子程序4PUSH AXPUSH BXPUSH CXPUSH DXCALL CROT;调用子程序CROTMOV CH,AL;装入入口参数MOV AH,01HINT21HCALL CROTMOV CL,ALMOV AH,01HINT21HCALL CROTMOV DH,ALMOV DL,0CALL ENTMOV AH,2DH;调DOS中断置时间INT21HCMP AL,0FFHJE FALPRT:PUSH DX;输出时间MOV AL,CHMOV AH,0MOV BL,0AHDIV BLADD AL,30HADD AH,30HMOV DL,ALMOV DH,AHMOV AH,02HINT21HMOV DL,DHINT21HMOV DL,3AHINT21HMOV AL,CLMOV AH,0DIV BLADD AL,30HADD AH,30HMOV DL,ALMOV DH,AHMOV AH,02HINT21HMOV DL,DHINT21HMOV DL,3AHINT21HPOP DXMOV AL,DHMOV AH,0DIV BLADD AL,30HADD AH,30HMOV DL,ALMOV DH,AHMOV AH,02HINT21HMOV DL,DHINT21HMOV AH,2CH;调DOS中断取时间INT21HMOV AL,0AH;写入OCW3OUT20H,ALNOP;延时NOPNOPNOPNOPNOPNOPNOPNOPNOPNOPNOPIN AL,20H;读取IRRAND AL,02HJNE MKCALL COV;调子程序COVJMP PRTFAL:LEA DX,MEG7MOV AH,09HINT21HMK:CALL ENTMOV AH,01HINT21HLEA DX,MEG8MOV AH,09HINT21HPOP DXPOP CXPOP BXPOP AXRETFUN4ENDPCROT PROC NEAR;子程序CROT,完成ASCII码转换成两位十进制数PUSH BXPUSH CXPUSH DXMOV BL,0;初始化BL和BHMOV BH,0AHMOV DX,02H;设循环次数GET:MOV AH,01HINT21HSUB AL,30HCMP AL,0JB FALCMP AL,09HJA FALXCHG AL,BLMUL BHADD AL,BLXCHG AL,BLDEC DXCMP DX,0JNE GETMOV AL,BLPOP DXPOP CXPOP BXRET CROT ENDPCOV PROC;格式控制,使光标回到上个制表位PUSH AXPUSH CXPUSH DXMOV CX,08HMOV AH,02HMOV DL,08HREC:INT21HLOOP RECPOP DXPOP CXPOP AXRETCOV ENDPENT PROC;格式控制,输出回车换行MOV DL,0DHMOV AH,02HINT21HMOV DL,0AHMOV AH,02HINT21HRETENT ENDPMAIN ENDPCODE ENDSEND MAI五、程序调试及运行结果:主菜单1、功能一(小写字母转大写字母):2、功能二(找出ASCII码最大的字符):3、功能三(按ASCII码把字符从大到小排列):4、功能四(显示跳动的时间):5、功能五(退出程序):如果是错误的输入,提示如下:六、实验心得通过这个实验,基本掌握了子程序的调用方法,子程序可以单独设计,主程序做好了,可以嵌套具体功能的子程序实现需求,这个实验子程序可以分开调试,子程序决定具体功能,主程序是一个框架,这点有种化大为小的思想,告诉我们一个复杂功能的程序,可以分模块,按功能,一部分一部分地实现,最后嵌套,进行最后调试。
实验四 子程序设计及跟踪调试实验
实验四子程序设计及跟踪调试实验【实验名称】子程序设计及跟踪调试实验【实验目的】学习子程序结构的设计方法,理解模块间主程序与子程序之间的调用关系,【实验内容】1、课本习题6.15(源程序、exe文件及执行结果)2、编写子程序,已知有两组N个元素的数据,分别存放在以BUF1和BUF2为首址的字节存储区中,要求用冒泡排序法将它们从小到大的排序。
参考程序清单:;主程序MAIN.ASMEXTRN SORT:FARDATA SEGMENTBUF1 DB 30H,10H,40H,20H,50H,70H,60H,90,80H,0,0FFHN1=$-BUF1BUF2 DB 22H,11H,33H,55H,44H,77H,66H,99H,88H,0AAH,0EEH,0N2=$-BUF2DATA ENDSCODE SEGMENTMAIN PROC FARASSUME CS:CODE,DS:DATA,SS:STACKBEGIN:MOV AX,DATAMOV DS,AXLEA BX,BUF1MOV CX,N1CALL SORTLEA BX,BUF2MOV CX,N2CALL SORTEXIT:;MOV AH,4CH;INT 21HRETMAIN ENDPCODE ENDSEND BEGIN;子程序SORT.ASM PUBLIC SORTCODE SEGMENTSORT PROC FARPUSH AXPUSH DXPUSH SIPUSH DIMOV DX,CXDEC DXMOV SI,1LOPI:MOV DI,SIINC DIMOV AL,[BX+SI-1] LOPJ:CMP AL,[BX+DI-1] JBE NEXTXCHG [BX+DI-1],AL MOV [BX+SI-1],AL NEXT:INC DICMP DI,CXJBE LOPJINC SICMP SI,DXJBE LOPIPOP DIPOP SIPOP DXPOP AXRETSORT ENDPCODE ENDSEND【实验要求】掌握主程序和子程序之间的参数传递方法。
《汇编语言》课程实验指导书
《汇编语言》课程实验指导书《汇编语言》课程实验指导书扬州大学信息学院计算机科学与工程系 2007年5月实验一 DEBUG的使用(一)目的及要求进一步熟悉常用的单、双操作数指令和各种寻址方式的功能及使用格式,初步掌握调试程序DEBUG程序的基本使用方法,为以后的实验打下基础。
(二)实验内容1、用 DEBUG的基本命令,单步执行y=(x-1)2+30的程序,检查每条指令执行后目的地址及有关寄存器的内容。
2、用DEBUG的A命令,键入如下程序段: MOV BX,8275HMOV AX,3412H ;双精度数34128275H——AX、BX ADD BX,92A5HADC AX,2F65H ;加上双精度数2F6592A5H ADD BX,0EAE6HADC AX,9C88H ;加上双精度数9C88EAE6H然后用T命令单步执行,查看每条指令执行后有关寄存器的内容及标志位的变化。
注意:①用A命令时键入的数均为十六进制,故其后的“H”不要键入.②用T命令不适合执行“INT”指令。
3、学会使用DEBUG中的命令:D、G、E、R、T、A、U,为后面调试运行汇编源程序打下基础。
实验二分支、循环程序设计(一)目的及要求1、进一步理解条件转移指令的格式及功能,以便在分支程序中选用合适的指令。
2、提高设计及调试分支程序的能力。
3、掌握循环程序的结构及循环控制方法,提高循环程序的设计能力。
(二)实验内容1、用 DEBUG的基本命令,执行P120例5-2程序。
2、根据以下各题的要求写出其源程序井上机调试运行,显示(或打印)出运行结果。
①从键盘输入一字符串存放在IN-BUF 缓冲区中,然后在下一行以相反顺序显示出来。
②以附录1的格式显示(或打印)出 ASCll码表。
对于无法显示出的格式符或功能符,如空白0、响铃7、换行OAH、回车ODH、空格4DH等均用空格代替。
实验三子程序设计(一)目的及要求1、熟练掌握子程序的设计方法与调用方式,并能正确地书写子程序说明。
实验四 选择结构程序设计2答案
#include "stdio.h"
main()
{ int i;
scanf("%d",&i);
switch(i)
{ case 1:
case 2:putchar('i');
case 3:printf("%d\n",i);break;
#include<stdio.h>
main()
{ float x,y,m=0,n=0;
scanf("%f,%f",&x,&y);
n=(x-2)*(x-2);
m=(y-2)*(y-2);
if((m+n)<=1) printf("(%.3f,%.3f)In the yuan",x,y);
}
printf("\nThe tax=%10.2f\n",tax);
}
[程序三]输入两个字符,若这两个字符的ASCII之差为偶数,则输出它们的后继字符,否则输出它们的前驱字符。
#include<stdio.h>
main()
{ char ch1,ch2,t1,t2;
else printf("前驱字符ch1=%c,ch2=%c",ch1-1,ch2-1);
}
[程序四]输入整数a、b,如果a能被b整除,则输出算式和商,否则输出算式、整数商和余数。
#include<stdio.h>
main()
{ int x,y;
printf("Please input (x,y): ");
实验四子程序设计实验
实验四:子程序设计实验专业班级姓名:学号:联系方式一、任务要求:1. 调试程序dmove.asm,观察片外数据区7000H、A000H开始的单元内容变化规律。
修改程序将7010H-7073H单元内容传送至B000H开始的存储区中。
2. 设计一个子程序,统计片外数据区从2000H开始的256个符号数中偶数的个数,低位存入R3,高位存入R2。
3.(选作题)设计子程序,实现对片外数据存储器的测试。
具体要求如下:1)测试方法自选2)数据存储区首地址、长度可变。
3)可统计坏单元数目,并记录坏单元地址。
4)利用LED指示灯,提示测试过程和结果状态。
二、设计思路实验一:1.用MOVX @DPTR, A 指令,向片外数据区7000H到70FFH单元内容送值。
2.用同样的指令,将7010H-7073H单元内容传送至B000H开始的存储区中。
实验二:1.将要检验的地址区域内容逐个取出,进行奇偶判断2.是偶数则统计加一,之后对下一位进行判断3.不是则对下一位进行判断4.结束后返回实验三:1.先将监测区域内赋值2.赋值完成后通过改变区域内的内容,再进行检测3.若两次的内容不相同,则统计数加一并记录地址4用P1,P2,P3口的状态来表示LED指示灯的工作状态三、资源分配实验一:1.起始地址为0090H2.向片外数据区7000H、A000H开始的单元赋值。
3.将7010H-7073H单元内容传送至B000H开始的存储区中。
实验二:1. 起始地址1000H2. 统计片外数据区从2000H开始的256个符号数中偶数的个数,低位存入R3,高位存入R2。
实验三:(选作题)1.起始地址2000H2.向7000H开始的片外RAM空间送监测数3.错误数目放在R2中4.错误地址放在片内IDA TE中四、流程图2.五、源代码(含文件头说明、资源使用说明、语句行注释)试验一代码:;File name: dmove.asm;Date:;Designed by:;Description: 数据块传送;Resource used: R0: 计数器; DPTR: 片外数据指针; R2, R3 源地址; R4, R5 目的地址; R6, R7 传送字节数ORG 0090HSTART: ;初始化7000H开始的片外RAM空间MOV R0, #00H ;设循环计数器MOV DPTR, #7000H ;设数据指针MOV R1, #00HLOOP1:MOV A, R1MOVX @DPTR, A ;传送到片外RAMINC DPTR ;修改数据指针INC R0 ;修改循环计数器INC R1CJNE R0, #00H, LOOP1 ;判断是否结束;给R2,R3,R4,R5,R6,R7赋初值MOV R2, #70HMOV R3, #10HMOV R6, #01HMOV R7, #00HMOV R4, #0b0HMOV R5, #00H;数据串传送DMVE: MOV SP, #70H ;设栈底MOV DPL, R3MOV DPH, R2MOVX A, @DPTR ;取一个字节MOV DPL, R5MOV DPH, R4MOVX @DPTR, A ;传送一个字节CJNE R3, #73H, DMVE1SJMP LP ;源地址加1 DMVE1: INC R3CJNE R5, #0FFH, DMVE2INC R4 ;目的地址加1 DMVE2: INC R5CJNE R7, #00H, DMVE3CJNE R6, #00H, DMVE4 ;数据传送结束?SJMP $ ;原地踏步DMVE3: DEC R7 ;字节数减1SJMP DMVEDMVE4: DEC R7DEC R6SJMP DMVELP : SJMP LPEND实验二代码:ORG 1000HMOV R2, #00H ;统计数目高位MOV R3, #00H ;低位MOV R1, #00H ;定义判定区间长度MOV DPTR,#2000H ;预先定义ALLER : MOVX A,@DPTR ;将目的地址中的内容送到A累加器中ANL A,#01H ;与1进行与运算CJNE A,#01H,COUNTN ;判定是否为偶数,是则跳至COUNTNINC DPTR ;指向下一地址SJMP GOCOUNTN: CJNE R3,#0FFH,COUNT1 ;判断低位是否将要溢出INC R2 ;高位进一MOV R3,#00HINC DPTRSJMP GOCOUNT1 : INC R3 ;低位加一INC DPTRSJMP GOGO: INC R1CJNE R1,#00H,ALLER;判定循环是否结束SJMP LPLP : SJMP LPEND实验三代码:ORG 2000HMOV P0,#00H ;显示送数与检测功能MOV P1,#00H ;显示程序执行结束MOV P2,#00H ;显示警告功能MOV P3,#00HSTART: ;初始化7000H开始的片外RAM空间MOV P0, #0FH ;LED显示开始送数MOV R0, #00H ;设循环计数器MOV R1, #10H ;坏地址MOV R2, #00H ;坏地址个数MOV DPTR,#7000H ;设数据指针ORGINAL DATA 7000H ;定义数据存放初始地址TEST DATA 00H ;定义判定值TEST的大小LOOP1:MOV A, #TEST ;MOVX @DPTR, A ;传送到片外RAMINC DPTR ;修改数据指针INC R0 ;修改循环计数器CJNE R0, #00H, LOOP1 ;判断是否结束MOV P0,#0FFH ;LED显示检错状态MOV DPTR,#ORGINAL ;返回数据区首地址CHECK: MOVX A,@DPTR ;将数据送入A累加器中CJNE A,#TEST,WARN ;与指定内容比较,不相同则出错SJMP GOGO : INC DPTRINC R0CJNE R0, #00H, CHECK;判断循环是否结束SJMP LPWARN : MOV P2,#0FFH ;LED显示出错状态INC R2 ;记录出错数目MOV A,DPHMOV @R1,AINC R1MOV A,DPLMOV @R1,A ;记录出错地址并存于R1中INC R1INC R1 ;留出间隔SJMP GOLP : MOV P0,#00HMOV P1,#0FFH ;LED显示程序结束状态SJMP LPEND注释:通过改变TEST 的数值来决定输送的检测数(可为任意数)再用手动改变区域的值来完成检验六、程序测试方法与结果、软件性能分析实验一:1. 片外数据区7000H、A000H开始的单元内容变化规律2. 7010H-7073H单元内容传送至B000H开始的存储区实验二:1. 向检测区送偶数2.检测结果(显示为十六进制)实验三:1. 向检测区送检测值以及LED状态送书完毕2. 篡改检测区内容3. 检测结果:(1)坏区数目R2(2)坏区地址(3)LED报警状态七、心得与体会这次实验通过传送数据的具体程序实验,进一步加深了对数据传送的基本步骤和思路的理解,在选作实验中也进一步对I/O的数据处理有了了解,在实验设计中对子程序和重复步骤的运用是相当重要的,对数据区的数据移动和传送也是要重点了解的。
实验四子程序设计
实验四子程序设计实验目的:通过编写子程序来实现函数的封装和代码的重用。
实验原理:子程序是一段具有特定功能的代码,可以在程序中多次调用。
在实际的软件开发过程中,为了提高代码的可读性、可维护性和代码的重用,我们经常使用子程序。
子程序的定义一般包括以下几个要素:1.子程序名称:子程序的名称用于被调用和调用。
子程序名称一般要具有描述性,能够清晰地表达其功能和作用。
2.输入参数:子程序可以接收输入参数,用于在子程序内部进行计算和处理。
输入参数可以是实际的数值,也可以是变量、数组等。
3.输出参数:子程序可以具有输出参数,用于将计算结果或者处理结果返回到主程序中。
输出参数可以是实际的数值,也能是变量、数组等。
4.子程序体:子程序体是子程序内部的代码块,用于实现具体的功能。
子程序体可以包含多条语句和控制结构,以完成复杂的操作和计算。
实验步骤:本次实验我们将编写一个求取三角形面积的子程序,实现代码的封装和重用。
1.编写主程序:首先,我们先编写一个主程序,用来调用子程序并输出计算结果。
```pythondef main(:a = float(input("请输入三角形的底边长: "))h = float(input("请输入三角形的高: "))area = triangle_area(a, h)print("三角形的面积为: ", area)def triangle_area(base, height):area = (base * height) / 2return areaif __name__ == "__main__":main```2. 编写子程序: 根据主程序中调用的子程序名称,我们可以编写一个名为`triangle_area`的子程序来计算三角形的面积。
```pythondef triangle_area(base, height):area = (base * height) / 2return area```3.运行程序:运行主程序,输入三角形的底边长和高,程序将输出计算结果。
实验四 子程序设计和调用
实验四子程序设计和调用一、实验目的1) 学习子程序的定义和调用方法。
2) 掌握子程序设计、编制及调试。
二、实验内容编写计算N个偶数之和的子程序和接收键入的N及将结果送显示器的主程序。
三、实验准备1) 阅读教材中有关的内容,按要求编写程序。
2) 熟悉字符显示程序段的编写。
四、实验设备PC机一台五、实验步骤1) 编辑、调试。
2) 运行·EXE文件并进行调试。
六、实验报告的要求1) 列出源程序。
2) 写出调试结果。
请N个偶数之和方法1stack segment stack 'stack'dw 32 dup(?)stack endsdata segmentinput db 'please input N: ','$'n db 6,0,6 dup(?)obf db 9 dup(?)data endscode segmentbegin proc farassume ss:stack,cs:code,ds:datasub ax,axpush axmov ax, datamov ds, axmov dx,offset input mov ah,9int 21hmov dx,offset nmov ah,10int 21hmov si,offset n+2mov cl,n+1mov ch,0call abccall sumshl ax,1mov bx,seg obfmov es,bxmov di,offset obf+1 call cbacall lfmov dx,offset obfmov ah,9int 21hretbegin endPsum procpush cxpush bx;加入你的程序,ax为出口 pop bxpop cxretsum endpabc procmov ax,0abc1: push cxmov cx,10mul cxand byte ptr[si],0fh add al,[si]adc ah,0pop cxloop abc1retabc endpcba procpush axpush bxpush cxpush dxpush dior ax,axjns plusmov byte ptr es:[di],'-' inc dineg axplus: mov cx,0mov bx,10lop1: mov dx,0div bxpush dxinc cxor ax,axjnz lop1lop2: pop axadd al,30hstosbloop lop2mov al,'$'stosbpop dipop dxpop cxpop bxpop axretcba endpLF PROCMOV DL,0AHMOV AH,2INT 21HMOV DL,0DHMOV AH,2INT 21HLF ENDPcode endsend begin需要加的程序mov cx,axmov bx,0mov ax,bxsm: add bx,1add ax,bxloop sm七、思考题要计算N个奇数之和,程序如何改写?奇数求和;shl ax,1 二倍关系 mov cx,axmov ax,0mov bx,1sm: add ax,bxadd bx,2loop sm。
实验4 子程序实验
实验4 子程序实验一.实验目的1.掌握主程序与子程序之间的调用关系及调用方法;2.掌握子程序调用过程中近程调用与远程调用的区别;3.掌握通过堆栈转送参数的方法。
二.实验内容1.将BUF开始的10个单元中的二进制数转换成两位十六进制数的ASCII码,在屏幕上显示出来。
要求码型转换通过子程序HEXAC实现,在转换过程中,通过子程序DISP实现显示。
2.编写一个主程序,从键盘接收若干个字符,然后用远调用的方法,调用子程序统计字符串中字符’b’的个数.子程序的参数是字符串的首地址TABLE,字符串长度N及字符”b”.子程序返回字符"b”的个数.参数传送采用堆栈实现.主程序在子程序返回后,显示字符”b”及其个数(设为一位十六进制数)。
三.实验要求1.第一个实验程序用子程序的近程调用实现。
由于在调用HEXASC子程序时,子程序又调用了DISP子程序,这叫子程序的嵌套调用。
实验过程中可以从堆栈的内容看到两个子程序的返回地址值。
由于是近调用,地址值只包括返回地址的段内偏移量。
在每个子程序的执行中,检查CS值是不变的。
2.第二个程序是利用远调用的方法调用子程序的。
在远调用情况下,主程序与子程序处在不同的逻辑代码段中,可在子程序执行中查看CS值,它与主程序中的CS值是不同的。
子程序调用后,堆栈中保留了返回地址的段地址及段内偏移量。
3.第二个程序中,主程序与子程序之间参数的传送是由堆栈实现的。
一段是将参数(此处是串首址TABLE,串的长度N及待统计的字符“b”)顺序压如堆栈,在子程序调用后,通过BP指针对堆栈中的参数访问,并将统计的结果通过堆栈返回。
有关该方法的原理此处不再介绍。
4.预习子程序设计的基本方法,根据实验内容要求,画出子程序及主程序的流程图;熟悉键盘键入字符串及用堆栈传送参数的程序段编制方法。
四.实验环境PC微机DOS操作系统或Windows 操作系统MASM.EXE,LINK.EXE,或宏汇编集成环境五.实验步骤1.编辑、汇编两个源程序,生成相应的可执行文件(.EXE)2.用DEBUG的R命令,T命令或G命令和D命令检查远程调用及近程调用时堆栈的变化。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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
附录
编写实验报告