实验6子程序
子程序实验报告

一、实验目的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)编译并运行程序,观察输出结果。
子程序设计实验报告1

子程序设计实验报告学号:0740303104姓名:雷凤子程序设计实验报告一、实验目的:1、训练子程序;调用程序以及DOS功能调用程序的编制,进一步熟悉和灵活使用系统功能调用,培养根据具体情况合理划分程序模块的能力2、掌握主、子程序之间的调用关系,联结方法,提高使用各种参数传递方法的正确性和灵活性。
3、掌握调试主、子程序的基本方法,通过调试进一步理解和加深堆栈在子程序设计中的重要意义的认识4、上机前要求写好被调试程序的程序文本,并进行静态调试,然后拟定好调试计划和上机操作步骤。
二、实验要求:1、具体了解和掌握call指令,主,子程序之间的调用和在使用时应注意的问题2、学习子程序设计和调用的一般方法。
三、实验内容1、实验任务试编制一程序,分别对NUM字节单元数组中统计出有多少个20,有多少个5,有多少个2,有多少个1.统计的个数分别放在NUM20、num5、num2、num1单元中。
1. 程序要求用主程序-子程序的结构形式编制。
2. 并且传递参数的方式为堆栈方法。
2、实验的原理在主程序部分,将统计个数的单元分别放在俩个通用寄存器——AH,AL,DH,DL中,数组首址和数组长度都压栈,设置一个循环次数,送给CX,再调用输出语句进行输出。
最重要的是子程序JUSUAN,做好保护现场等准备工作后就将数组中的每个元素分别与20,5,2,1比较,根据不同的结果转到不同的分支语句,对应的不同的计数器相应地增1,并修改地址,继续循环比较。
3、程序设计流程图子程序流程图四、实验步骤1、编辑(纪事本)DATAS SEGMENTNUM DB 20,1,20,5,2,5,2,2,2,20 COUNT EQU $-NUMNUM20 DB?NUM5 DB?NUM2 DB?NUM1 DB?;此处输入数据段代码DATAS ENDSSTACK SEGMENT PARA STACK 'STACK' STAPN DB 100 DUP(?);此处输入堆栈段代码STACK ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACK MAIN PROC FARPUSH DSSUB AX,AXPUSH AXMOV AX,DATASMOV DS,AXMOV AX,STACKMOV SS,AXSTART:MOV BX,OFFSET NUM ;取偏移地址MOV CX,COUNT ;数组长度送给CXPUSH BX ;数组首地址入栈PUSH CX ;数组长度进栈 CALL JISUAN ;调用子程序MOV NUM20,AH ;将统计的个数保存MOV NUM5,ALMOV NUM2,DHMOV NUM1,DLMOV CX,4 ;设置循环次数LEA DI,NUM20 ;取偏移地址COUT:ADD [DI],30H ;输出MOV DL,[DI]MOV AH,02HINT 21HINC DILOOP COUTRETMAIN ENDPJISUAN PROC;PUSH Bx ;保护现场PUSH CXPUSH BPMOV BP,SP ;当前栈顶地址送BP BEGIN:MOV DI,[BP+10] ;DIMOV CX,10 ;CXSUB AX,AX ;计数器清零SUB DX,DX ;计数器清零GO:CMP BYTE PTR [DI],20JE NEXT1 ;比较,相等就转CMP BYTE PTR [DI],5JE NEXT2CMP BYTE PTR [DI],2JE NEXT3CMP BYTE PTR [DI],1JE NEXT4DO: INC DI ;修改地址LOOP GOJMP ANEXT1: INC AH ;计数器加1 JMP DONEXT2: INC ALJMP DONEXT3: INC DHJMP DONEXT4: INC DL JMP DOA: ;POP BX ;恢复现场POP CXPOP BPRET 4;此处输入代码段代码;JISUAN ENDPCODES ENDSEND MAIN2、汇编(masm/ML)3、连接(link)4、调试(debug)5、运行3241Press any key to continue五、实验中各个步骤遇到的问题及解决方法、1、汇编(masm/ML)虽然思路比较清晰,但在用堆栈方式进行参数传递时出现了一些语法错误,不知道该何时进栈,对到底应该哪个寄存器进栈也没弄太明白。
子程序设计实验报告范文精简处理

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

子程序设计实验报告子程序设计实验报告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`,计算圆形的面积并返回结果。
子程序结构实验

第六章子程序结构实验(一)例:十六进制到十进制的转换(通过寄存器传送参数)程序如下:hexidec segment; 16?10assume cs:hexidec main proc farstart:push dssub ax,axpush axrepeat:call hexibin;16?2call binidec;2?10jmp repeatretmain endphexibin proc nearmov bx,0 newchar:mov ah,1int21hsub al,30hjl exitcmp al,10jl add_tosub al,27hcmp al,0ahjl exitcmp al,10hjge exitadd_to:mov cl,4shl bx,clmov ah,0add bx,axjmp newchar exit:rethexibin endpbinidec proc nearmov cx,10000dcall dec_divmov cx,1000dcall dec_divmov cx,100dcall dec_divmov cx,10dcall dec_divmov cx,1dcall dec_divretdec_div proc nearmov ax,bxmov dx,0div cxmov bx,dxmov dl,aladd dl,30hmov ah,2int21hretdec_div endpbinidec endphexidec endsend start实验过程如下:、(二)例:累加数组中的元素(通过存储器传送参数)程序如下:data segmentary dw 1,2,3,4,5,6,7,8,9,10count dw10sum dw?data endscode segment main proc farassumecs:code,ds:datamov ax,datamov ds,axcall proaddmov ax,4c00hint21hmain endpproadd proc nearpush axpush cxpush silea si,arymov cx,countxor ax,ax next:add ax,[si]add si,2loop nextmov sum,axpop sipop cxpop axretproadd endpcode endsend maindata segmentary dw 1,2,3,4,5,6,7,8,9,10count dw10sum dw?ary1dw 10,20,30,40,50,60,70,80,90,100 count1dw10sum1dw?data ends实验过程如下:(三)例:累加数组中的元素(通过地址表传送参数地址)程序如下:data segmentary dw 10,20,30,40,50,60,70,80,90,100count dw10sum dw?table dw3dup (?);地址表data endscode segmentmain proc farassume cs:code,ds:datapush dssub ax,axpush axmov ax,datamov ds,axmov table,offset arymov table+2,offset countmov table+4,offset summov bx,offset tablecall proaddretmain endpproadd proc nearpush axpush cxpush sipush dimov si,[bx]mov di,[bx+2]mov cx,[di]mov di,[bx+4]xor ax,ax next:add ax,[si]add si,2loop nextmov[di],axpop dipop sipop cxpop axretproadd endpcode endsend main实验过程如下:(四)例:累加数组中的元素(通过堆栈传送参数地址)程序如下:data segmentary dw 10,20,30,40,50,60,70,80,90,100count dw10sum dw?data endsstack segmentdw100dup(?)tos label wordstack endscode1segmentmain proc farassume cs:code1,ds:data,ss:stack start:mov ax,stackmov ss,axmov sp,offset tosmov ax,datamov ds,axmov bx,offset arypush bxmov bx,offset countpush bxmov bx,offset sumpush bxcall far ptr proaddmov ax,4c00hint21hmain endpcode1endscode2segmentassume cs:code2proadd proc farpush bpmov bp,sp push axpush cxpush sipush dimov si,[bp+0ah] mov di,[bp+8] mov cx,[di] mov di,[bp+6] xor ax,ax next:add ax,[si] add si,2loop nextmov[di],axpop dipop sipop cxpop axpop bpret6proadd endpcode2endsend 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.实验目的(1)掌握主程序与子程序之间的调用关系及其调用方法。
(2)掌握子程序调用过程中近程调用与远程调用的区别。
(3)掌握通过堆栈传送参数的方法。
2.实验内容(1)将BUF开始的10个单元中的二进制数转换成两位十六进制数的ASCⅡ码,并在屏幕上显示出来。
要求码型转换通过子程序HEXASC实现,在转换过程中,通过子程序DISP 实现显示。
(2)编写一个主程序,从键盘接收若干个字符,然后用远调用方法,调用子程序统计字符串字符“b”的个数。
子程序的参数是字符串的首地址TABLE、字符长度N及字符“b”。
子程序返回字符“b”的个数。
参数传送采用堆栈实现。
主程序在子程序返回后,显示字符“b”及其个数(设为一位十六进制数)。
3. 实验准备(1)预习子程序设计的基本方法,根据实验内容要求,画出主程序及子程序的流程图。
(2)熟悉键盘输入字符串及用堆栈传送参数的程序段编制方法。
4. 编程提示(1)第一个实验程序用子程序的近程调用实现。
由于在调用HEXASC子程序时,子程序又调用了DISP子程序,这叫做子程序的嵌套调用。
实验过程中可以从堆栈的内容看到两个子程序的返回地址值。
由于是近调用,地址值只包括返回地址的段内偏移量。
在每个子程序的执行中,检查CS值是不变的。
(2)第二个程序是利用远调用的方法调用子程序的。
在远调用情况下,主程序与子程序处在不同的逻辑代码中,可在子程序执行中查看CS值是不同的。
子程序调用后,堆栈中保留了返回地址的段地址及段内偏移量。
(3)第二个程序中,主程序与子程序之间参数的传送是由堆栈实现的。
一段是将参数(此处是串首址TABLE,串的长度N及待统计的字符“b”)顺序压入堆栈,在子程序调用后,通过BP指针肆堆栈中的参数访问,并将统计的结果通过椎栈返回。
有关该方法的原理此处不再介绍。
5.实验步骤(1)编辑、汇编两个源程序,生成相应的可执行文件(.EXE)。
(2)有DEBUG的R命令、T命令或G命令检查远程调用及近程调用时堆栈的变化。
子程序设计实验报告简版修正
子程序设计实验报告1. 实验目的本实验旨在通过设计子程序,巩固和提升学生对于子程序设计的理解和运用能力,培养学生的逻辑思维和程序设计能力。
2. 实验内容2.1 设计一个子程序,实现两个数相加的功能。
2.2 设计一个子程序,实现两个数相乘的功能。
2.3 设计一个子程序,实现对一个数的平方根的计算。
3. 实验步骤3.1 子程序1:实现两个数相加assemblyadd_numbers:; 输入:寄存器R1和R2分别存放两个待相加的数; 输出:寄存器R0存放相加结果; 保存现场PUSH R1PUSH R2; 执行相加操作ADD R0, R1, R2; 恢复现场POP R0POP R2POP R1; 返回RET3.2 子程序2:实现两个数相乘assemblymultiply_numbers:; 输入:寄存器R1和R2分别存放两个待相乘的数 ; 输出:寄存器R0存放相乘结果; 保存现场PUSH R1PUSH R2; 执行相乘操作MUL R0, R1, R2; 恢复现场POP R0POP R2POP R1; 返回RET3.3 子程序3:实现对一个数的平方根的计算assemblycalculate_sqrt:; 输入:寄存器R1存放待计算平方根的数 ; 输出:寄存器R0存放计算结果; 保存现场PUSH R1PUSH R0; 初始化结果为0XOR R0, R0; 循环计算平方根LDR R2, 1 ; 设定计算误差精度为1 sqrt_loop:; 比较结果的平方与待计算数的大小MUL R3, R0, R0CMP R3, R1; 结果满足精度要求,跳出循环BHI sqrt_done; 调整结果ADD R0, R0, R2; 继续循环B sqrt_loopsqrt_done:; 恢复现场POP R0POP R1; 返回RET4. 实验结果和分析经过上述子程序的设计和实现,我们实现了两个数相加、两个数相乘、以及一个数的平方根的计算功能。
汇编语言实验报告_6
青岛理工大学课程实验报告
课程名称汇编语言程序设计班级实验日期
2013.11.3
姓名学号实验成绩
实验
名称
子程序
实验目的及要求1.掌握子程序设计相关指令和伪指令的使用方法
2.掌握子程序设计方法, 特别是参数传递方法
3.掌握主程序和子程序之间的调用关系和调用方法
4.熟悉循环和子程序结合应用解答问题的思路
实验环境1.命令行方式
2.MASM.EXE LINK.EXE DEBUG.EXE
实验内容1.设DATA1开始的内存单元中, 存放着一串带符号字数据, 要求采用冒泡排序算法(Bubble Sort)按照从小到大的顺序排序并将排好序的数据存在DATA1开始的单元。
然后在显示器输出排好序的数据, 中间用’,’隔开。
2.输出数据使用子程序方式。
算法描述及实验步骤步骤:
(1)设置数据段地址
(2)设置堆栈段地址
(3)设置堆栈指针
(4)调用9号功能, 输出一个提示性字符串。
(5)循环进入子程序, 输出原始数据。
(6)在子程序内循环输出每一位的十进制数字。
(7)主程序进行内外循环, 进行冒泡排序。
(8)再一次调用子程序输出排序后的结果。
调试过程及实验结果调试过程:
(2)(1)在输出时, 调用DOS 9号功能, 并不是只要语句MOV AH,09H
(3)它是存在入口条件的, 入口条件:DS:DX=输出字符缓冲区首地址。
所以前面必须加上MOV DX,OFFSET NOTE1。
(4)汇编语言是不会再输出汉字的。
(5)子程序结束时一定要有RET
(6)冒泡排序也遇到一些困难。
调试结果:。
子程序及中断实验
成绩:计算机原理实验室实验报告课程:汇编语言与微机原理姓名:专业:网络工程学号:日期:2016年12月9日太原工业学院计算机工程系实验五:子程序及中断实验实验环境PC机+Win 2007+emu8086+proteus仿真器实验日期2016.12.9 一.实验内容实验目的:实现子程序和中断服务子程序的设计编写主程序实现子程序和中断服务子程序的调用实验内容:编写子程序设置40H中断为自定义中断服务子程序编写中断服务子程序实现AX=AX+BX或功能自拟。
编写主程序调用子程序和中断二.理论分析或算法分析1.中断向量表表的地址位于内存的00000H~003FFH,大小为1KB,用于存放256个中断的中断服务程序的入口地址;每个入口占用4 Bytes,低字为段内偏移,高字为段基址。
中断向量表如下图所示:内部中断服务程序编写内部中断服务程序与编写子程序类似,利用过程定义伪指令PROC/ENDP 结构实现,最后用IRET指令中断返回;主程序利用INT n指令调用中断服务程序,调用前需要设置中断向量。
中断服务程序的装载方法将已经编写好的中断服务程序的入口地址写入中断向量表中。
注意:向量表所在的段地址=0;若中断类型号为n,则新偏移地址写入4×n处,新段地址写入4×n+2处即可,直接写入法或利用系统功能调用都可实现地址写入CPU执行INT N指令的过程CPU取出INT N指令,经指令译码获知这是一条中断指令。
N就是该软件中断的中断向量码。
执行中断指令,首先自动将PSW、CS和IP压入堆栈保护起来,并关中断。
然后,将中断向量码N乘4得到中断向量表偏移地址(段地址为0000H),从该地址开始的顺序两个单元的内容送IP,下两个单元的内容送CS。
即找到服务程序入口地址,进而转向中断服务程序。
服务结束后通过IRET返回断点继续执行下面的指令。
三.实现方法(含实现思路、程序流程图、实验电路图和源程序列表等)源代码mov ax, 1mov bx, 2lp1:code segmentassume cs:code, ds:codest:mov ax, codemov ds, axxor ax, axmov es, axmov di, 40H*4climov ax, es:[di]mov old, axmov ax, es:[di+2]mov old+2, axmov ax, offset newint40mov es:[di], axmov ax, seg newint40mov es:[di+2], axstiint 40hjmp lp1newint40 proc faradd ax, bxmov num, axiretnewint40 endpold dw ?, ?num dw 0code endsend st四.实验结果分析(含执行结果验证、输出显示信息、图形、调试过程中所遇的问题及处理方法等)五.结论.通过本次实验,是我对子程序和中断服务子程序的语句结构,中断向量表结构、中断服务程序链的实现过程有了更多的认识,通过部分中断命令有了直观的演示,是我对其有了更深的理解!。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
深圳大学实验报告课程名称:微机原理与接口技术
实验项目名称:子程序
学院:
专业:
指导教师:
报告人:学号:班级:
实验时间:
实验报告提交时间:
教务处制
程序内容:
data segment 定义数据段
ary1 db 1,2,3,4,5,6
cc1 equ $-ary1
sum1 dw ?
ary2 db 7,8,9,10
cc2 equ $-ary2
sum2 dw ?
pkey db "press any key...$"
ends
stack segment 定义堆栈段
spae db 200 dup(?)
top equ 200
ends
code segment 定义代码段
assume cs:code,ds:data,ss:stack
start:
mov ax, data
mov ds, ax
mov ax,stack
mov ss,ax
mov sp,top 栈顶指向top首地址,即sp=00c8h mov ax,cc1
push ax
lea ax,ary1 取ary1首地址
push ax 堆栈保护
call sum 调用子程序sum
mov ax,cc2
push ax
lea ax,ary2
push ax
call sum
mov ax, 4c00h
int 21h
sum proc near 子程序
push ax
push bx
push cx 堆栈现场保护ax,bx,cx
mov bp,sp
pushf 保护fr
mov cx,[bp+10] 数组长度
mov bx,[bp+8]
xor ax,ax ax清零
a1: add al,[bx] 数组相加
inc bx
adc ah,0
loop a1
mov [bx],ax 送数组和
popf
pop cx
pop bx
pop ax 恢复前面被保护的ax,bx,cx,fr ret 4 返回作废参数
sum endp
code ends
end start
实验报告
1.思考sum1,sum2的段及偏移地址为多少?
Sum1 0710:0006
Sum2 0710:000c
2.查看sum1,sum2的内容并和手算结果比较。
Sum1=0015h
Sum2=0022h
与手算结果sum1=21 sum2=34一致
3.画出程序堆栈的示意图。
第一次堆栈:
0712:00c8 0000 sp
0712:00c6 0006 串长
0712:00c4 0000 首地址
0712:00c2 0018 ip
0712:00c0 0000 ax
0712:00be 0000 bx
0712:00bc 0137 cx (bp)
0712:00ba 0202 fr
第二次堆栈:
0712:00c8 0000 sp
0712:00c6 0004 串长
0712:00c4 0008 首地址
0712:00c2 0023 ip
0712:00c0 0008 ax
0712:00be 0000 bx
0712:00bc 0137 cx (bp)
0712:00ba 0202 fr
4.写出自编的程序及绘制流程图,并注释程序。
data segment
ary1 db 1,2,3,4,5,6
cc1 equ $-ary1
sum1 dw ?
ary2 db 7,8,9,10
cc2 equ $-ary2
sum2 dw ?
pkey db "press any key...$"
ends
stack segment
spae db 200 dup(?)
top equ 200
ends
code segment
assume cs:code,ds:data,ss:stack
start:
mov ax, data
mov ds, ax
mov ax,stack
mov ss,ax
mov sp,top
mov ax,cc1
push ax
lea ax,ary1
push ax
call sum
mov ax,cc2
push ax
lea ax,ary2
push ax
call sum
mov ax, 4c00h.
int 21h
sum proc near
push ax
push bx
push cx
mov bp,sp
pushf
mov cx,[bp+10]
mov bx,[bp+8]
xor ax,ax
a1: add al,[bx]
inc bx
adc ah,0
loop a1
mov [bx],ax
call display 调用子程序display
popf
pop cx
pop bx
pop ax
ret 4
sum endp
display proc near
push cx
push dx
push bx 保护寄存器
mov cl,4
mov ch,4
mov bx,ax
lop1:rol bx,cl 左移4位,及移动一个双字mov dl,bl
and dl,0fh 高位清零
cmp dl,0ah 与0ah比较大小
js lop2 小于0ah转lop2
add al,07h
lop2:add dl,30h 小于0ah加30h,大于等于加37h mov ah,2h
int 21h
dec ch
jnz lop1 循环直到每位都比较输出
pop bx
pop dx
pop cx
ret
display endp 子程序返回
code ends
end start
流程图:
5.实验体会和建议。
通过实验,掌握了利用堆栈传递参数的子程序调用方法,并且明白了堆栈的方式。
另外对伪指令proc,endp,near,far等有进一步了解。
同时了解了子程序最重要的一点,对寄存器的保护功能。
对汇编也有进一步认识。
注:程序未注释部分与前面实验相同或相似,故不重复注释。