福建农林大学_汇编实验四_子程序设计
子程序实验报告
一、实验目的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)虽然思路比较清晰,但在用堆栈方式进行参数传递时出现了一些语法错误,不知道该何时进栈,对到底应该哪个寄存器进栈也没弄太明白。
第五次汇编语言实验报告子程序设计
汇编语言实验报告Assembly Language Programming Lab Reports班级:姓名:学号:实验日期:学院:专业:实验顺序:原创: ___ 实验名称:子程序设计实验分数:考评日期 : 指导教师:一.实验目的1、掌握过程调用伪指令 : PROC,ENDP,NEAR和 FAR。
2、掌握 CALL,RET,RET n 。
理解子程序调用时现场保护和恢复现场的意义。
3、掌握子程序传递参数的三种方式,寄存器,内存单元,堆栈。
4、培养在复杂的程序设计时,采用模块化结构划分功能,分解程序的意识。
5、对子函数的嵌套调用和递归调用有一定的理解。
二.实验环境操作系统:windows 8 编译程序:masm 5.0三.实验原理1. 子程序递归,堆栈传参2. 寄存器、存储器传参四.实验步骤及结果分析1.子程序递归调用(求阶乘) 用堆栈进行传递参数高级语言函数调用过程Fac(n) = fac(n-1)*n n>0Fac(n)= 1 n=0Int fac(int n){int f;If (n<=0)F==1;Else f=fac(n-1)*n;}在汇编语言中子程序没有形参和实参,直接更改的是给定寄存器或者内存单元或者栈中的数据,需要自己开辟类似形参的空间去保存相应的数据,在这里最好的办法就是用栈。
源代码:stack segment stackdb 100h dup(?)stack endsdata segmentresult dw ?data endscode segmentmain proc farassume cs:code,ds:datastart:mov ax,datamov ds,axmov ax,5push axcall factmov result,axmov ah,4chint 21hmain endpfact proc nearpush bpmov bp,spmov ax,[bp+4]cmp ax,0ja result1mov ax,1jmp result2result1:dec ax push ax call fact mov bx,[bp+4]mul bx result2:pop bpret 2 fact endp code ends end start 实验结果:2.实现两个输入的十进制数相减法,相乘,相除,三者任选一个。
福建农林大学_汇编实验三_分支循环程序设计详解
福建农林大学计算机与信息学院实验报告系:计算机专业:计算机科学与技术年级:2014姓名学号:实验室号__ 计算机号实验时间:2016-10-29指导教师签字:刘庆连成绩:实验三分支循环程序设计1.实验目的(1)学习调试程序,查找逻辑错误;(2)学习分支语句的编程和调试;(3)学习循环语句的编程和调试。
2.实验内容1)有10个数,统计正数的个数,存放在变量M中中。
经过汇编后,形成EXE文件。
在DEBUG中,先用G=0命令执行程序,用D命令查看M单元的内容,会发现结果不正确。
用单步执行命令T=0,单步执行程序,查找程序中的逻辑错误,注意每一次循环中AL 寄存器中值的变化是否正确?(AL寄存器中存放正数的个数)DSEG SEGMENTMSG DB 4, -2, -6, 0, 5, 67, 8, -3, 5, 6M DB ?DSEG ENDSCSEG SEGMENTASSUME CS: CSEG, DS: DSEGSTART: MOV AX, DSEGMOV DS, AXMOV CX, 10MOV AL, 0LEA SI, MSGL1: MOV BL, [SI]CMP BL, 0JBE NEXTINC ALNEXT: INC SILOOP L1MOV M, ALMOV AL, 0MOV AH, 4CHINT 21HCSEG ENDSEND START2)数据段中是一组无符号数,将最小数存放在M单元中。
按上题方法查找一处逻辑错误。
DSEG SEGMENTMSG DB 13, 15, 7, 25, 24M DB ?DSEG ENDSCSEG SEGMENTASSUME CS: CSEG, DS: DSEGSTART: MOV AX, DSEGMOV DS, AXMOV CX, 4MOV AL, MSGMOV SI, OFFSET MSG+1L1: CMP AL, [SI]JB NEXTMOV AL, [SI]NEXT: LOOP L1MOV M, ALMOV AL, 0MOV AH, 4CHINT 21HCSEG ENDSEND START3)编程:在首地址为BUF开始的内存单元中存有10个字节数,求其中0的个数,并将结果存于RESULT中。
汇编 子程序设计
实验四子程序设计一、实验目的(1)掌握汇编语言子程序设计方法。
(2)掌握主程序与子程序之间的调用关系及调用方法。
(3)掌握通过寄存器传送参数的方法。
二、实验环境(1) 硬件环境:计算机系统windows;(2) 软件环境:装有MASM、DEBUG、LINK、等应用程序。
三、实验内容(方法步骤):编程实现:十进制到十六进制数转换程序。
程序要求:从键盘取得一个十进制数,然后把该数以十六进制形式在屏幕上显示出来。
四、实验说明(1) 键盘输入的十进制数(ASCII),要将它转换成二进制存放。
⇒子程序:DECIBIN(2) 二进制转换成十六进制数并显示⇒子程序:BINIHEX(3) 为避免屏幕上的重叠,必须有回车和换行功能。
⇒子程序:CRLF用三个子程序联合实现题目要求⇒联合由主程序达到。
将BX寄存器作为过程之间传送转换数据的“交通员”。
五、实验步骤(1)编辑、汇编源程序,生成相应的可执行文件(.EXE)(2)检查程序执行的结果是否正确。
六、流程图主程序流程图如下图:子程序CRLF流程图如下图:子程序DECIBIN流程图如下图:子程序BINIHEX流程图如下图:七、源程序data segmentdata endscode segmentassume cs:code,ds:data main:call DECIBINcall CRLFcall BINIHEXmov ah,4Chint 21hDECIBIN PROCMOV BX,0NEWCHAR:MOV AH,1INT 21HSUB AL,30HJL EXITCBWXCHG AX,BXMOV CX,10DMUL CXXCHG AX,BXADD BX,AXJMP NEWCHAR EXIT:RETDECIBIN ENDPCRLF PROC NEARMOV AH,02HMOV DL,0AHINT 21HMOV AH,02HMOV DL,0DHINT 21HRETCRLF ENDPBINIHEX PROC NEAR START:MOV CH,4NOTATE:MOV CL,4ROL BX,CLMOV AL,BLAND AL,0FHADD AL,30HCMP AL,3AHJL PRINTITADD AL,7HPRINTIT:MOV DL,ALMOV AH,2INT 21HDEC CHJNZ NOTATERETBINIHEX ENDPcode endsend main八、问题思考(1)当输入“#”时,退出主程序,如何修改程序?(2)说明用寄存器传送参数的过程及其具体方法,各子程序的应用。
汇编实验报告--子程序设计实验
实验五子程序设计实验学生姓名:何茂杰学号: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. 实验目的通过本次实验,我将掌握以下技能:- 理解子程序的概念和作用- 掌握子程序的定义和调用- 理解子程序的参数传递方式- 学会使用子程序进行程序的模块化设计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. 实验背景子程序是一个独立于主程序的独立程序段,它可以完成特定的任务并返回结果。
子程序可以被主程序调用多次,不仅可以提高程序的可读性和可维护性,还可以节省重复代码的编写和修改时间。
在实际的程序设计中,子程序被广泛应用于各种领域,如算法实现、功能模块划分、错误处理等。
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(\。
汇编实验4
实验四子程序设计一、实验目的1.掌握子程序设计与调用方法。
2.掌握子程序参数的传递方法。
3.进一步熟悉debug的使用。
二、实验内容编程并调试:在内存中两个变量buf1、buf2保存两个整数,相加后存入re中,再将结果(re中)按16进制显示。
要求:两数相加用子程序实现,参数使用地址表形式;输出用子程序实现,参数用堆栈传递。
三、实验要求●每人一组独立进行上机实验;●实验时自行进行程序的调试、编译和执行过程。
●认真进行实验数据记录:自己程序的运行结果以及关键的中间结果。
●每个实验代码调试成功后,应及时让实验指导老师给予检查和登记。
●实验结束后按时提交实验报告以及源程序(电子文档)。
文件夹的命名规则请按照实验要求设定,然后将整个文件夹压缩打包后提交。
源程序提交:⏹每个实验项目文件放入一个文件夹中,文件夹命名规则统一为:班级学号实验编号,如0801班6号,完成实验二,则文件夹命名为:080106(若一个项目中有多个文件,则依次命名为:班级学号实验编号序号,如完成实验二的第3个实验,则文件命名为:08010623.asm)。
提交源程序时应提交全部的实验文件,包括asm文件、obj文件和exe文件等,然后将项目文件夹中压缩打包后提交(压缩包的名称和项目文件夹名称相同)。
⏹一旦发现抄袭行为,则该实验项目计0分。
实验报告:使用统一实验报告封面。
中南大学软件学院汇编语言实验报告(实验x)姓名:学号:正文部分:实验内容与要求。
实验步骤:原理、算法、流程图、程序实现部分代码。
实验结果既分析:填写自己程序的运行结果以及关键的中间结果。
总结:对汇编语言实验的理解、感想。
福建农林大学c#实验四
实验四文件与WFP应用程序设计一、实验目的:1、了解与文件处理相关属性、方法、事件。
2、掌握WPF应用程序创建的一般过程。
3、掌握“持有对方引用”的访问方式。
二、实验内容:设计并实现一个小型记事本应用程序,要求如下:(1)主界面如图1所示:图1 主界面(2)当用户执行“查找替换”命令后,将弹出如图2所示的窗口。
图2 查找替换窗口(3)实现各个菜单项的基本功能。
(4)在实现基本功能完成的情况下可以自由发挥,可以添加新的功能。
三、部分代码参考(1)主窗口的XAML代码:<Window x:Class="NodePad.Window1"xmlns="/winfx/2006/xaml/presentation"xmlns:x="/winfx/2006/xaml"Title="无标题-记事本" Height="220" Width="300"><Grid><DockPanel><Menu DockPanel.Dock="Top"><MenuItem Header="文件(_F)"><MenuItem Header="新建(_N)" InputGestureText="Ctrl+N" Name="menuNewFile" Click="menuNewFile_Click"/><MenuItem Header="打开(_O)..." InputGestureText="Ctrl+O" Name="menuOpenFile" Click="menuOpenFile_Click"/><MenuItem Header="保存(_S)" InputGestureText="Ctrl+S" Name="menuSaveFile" Click="menuSaveFile_Click"/><MenuItem Header="另存为(_A)..." InputGestureText="Ctrl+A" Name="menuSaveAsFile" Click="menuSaveAsFile_Click"/><Separator/><MenuItem Header="退出(_X)" InputGestureText="Ctrl+X" Name="menuExit" Click="menuExit_Click"/></MenuItem><MenuItem Header="编辑(_E)"><MenuItem Command="Undo"/><MenuItem Command="Redo"/><MenuItem Command="Copy"/><MenuItem Command="Cut"/><MenuItem Command="Paste"/><MenuItem Command="Delete"/><MenuItem Command="SelectAll"/><Separator/><MenuItem Header="查找替换" Name="menuFindAndReplace" Click="menuFindAndReplace_Click" InputGestureText="Ctrl+F"/><Separator/><MenuItem Name="menuDate_Time" Click="menuDate_Time_Click" Header="时间/日期"></MenuItem></MenuItem><MenuItem Header="格式(_O)"><MenuItem Name="menuAutoWrap" Click="menuAutoWrap_Click" IsChecked="True" Header="自动换行(U)" /></MenuItem></Menu><TextBox TextWrapping="Wrap" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto" DockPanel.Dock="Bottom" Name="txtContent" AcceptsReturn="True"></TextBox></DockPanel></Grid></Window>(2)弹出“打开”对话框,并将用户选择的文本文件的内容显示在记事本中。
实验四、子程序设计
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进制数显示. 要求:熟练掌握子程序设计方法
汇编实验 子程序设计
实验五子程序结构设计一、实验目的1、加深对子程序的理解,掌握子程序的结构。
2、掌握子程序的设计、编写及调试方法。
3、掌握宏定义及宏调用的方法。
二、实验内容1、已知在内存数据段中GRADE开始单元连续存放着10个学生的成绩,试采用子程序结构编程实现以下功能:(1)找到最高成绩,将其偏移地址存放在内存单元MAX中。
(2)统计不及格的人数,存放在内存单元COUNT中。
(3)计算平均成绩(只取整数部分),并在屏幕上显示。
要求:将以上功能分别写成子程序,数据区定义如下DSEG SEGMENTGRADE DB 76,68,54,80,45,92,63,58,94,85MAX DW ?COUNT DB ?DSEG ENDS源代码:DATAS SEGMENTGRADE DB76,68,54,80,45,92,63,58,94,85MAX DW?COUNT DB?DATAS ENDSSTACKS SEGMENT;此处输入堆栈段代码STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKSMAIN PROC FARSTART: PUSH DSMOV AX,0PUSH AXMOV AX,datasMOV DS,AXCALL MAXGRADECALL BUJIGECALL A VGRADERETMAIN ENDPMAXGRADE PROC FARpush axpush cxpush simov cx,10mov ax,0mov si,axstart_loop:mov ax,word ptr grade[si]cmp ax,word ptr grade[si+1]jge bigmov ax,word ptr grade[si+1]big: inc siloop start_loopmov max,axpop sipop cxpop axretMAXGRADE ENDPBUJIGE PROC FARPUSH SIPUSH CXPUSH AXMOV AX,0MOV COUNT,0MOV CX,10LOOP_START2:MOV AX,WORD PTR GRADE[SI]CMP AX,60JG SMALL2INC COUNTSMALL2:INC SILOOP LOOP_START2POP AXPOP CXPOP SIRETBUJIGE ENDPA VGRADE PROC FARpush dssub ax,axpush axmov ax,DATASmov ds,axmov cx,10 ;循环控制mov bx,0mov dx,0 ;暂存总成绩avg_grade_1:mov al,grade[bx]cbwadd dx,axinc bxloop avg_grade_1mov ax,dxmov bl,10div bl ;除第一次sub ah,ah ;清零div bl ;除第二次push axadd al,30hmov dl,almov ah,02int 21hpop axadd ah,30hmov dl,ahmov ah,02int 21hmov ah,4chint 21hretA VGRADE ENDPCODES ENDSEND2、编写程序实现十进制数的加减运算。
实验四子程序设计实验
实验四:子程序设计实验专业班级姓名:学号:联系方式一、任务要求: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.实验目的1.掌握分支程序的结构。
2掌握分支程序的设计、调试方法。
2.实验设备微机一台3.内容设计一数据块间的搬移程序设计思想:程序要求把内存中一数据区(称为源数据块)传送到另一存贮区(称为目的数据块)。
源数据块和目的数据块在存贮中可能有三种情况。
对于两个数据块分离的情况,数据的传送从数据块的首址开始,或者从数据块的末址开始均可,但对于有部分重叠的情况,则要加以分析,否则重叠部分会因“搬移”而遭破坏。
可以得出以下结论:当源数据块首址〉目的块首址时,从数据块首址开始传送数据。
当源数据块首址〈目的块首址时,从数据块末地址开始传送数据。
流程图:结果:在源数据块中存入6个数,分别使SI大于、等于、小于DI均发觉数据正确传送。
可见程序正确。
实现代码如下:DATA SEGMENTORG 3500HSRC_MESS DB 1,2,3,4,5,6ORG 3510HNEW_LOC DB 20 DUP(0)DATA ENDS;CODE SEGMENTASSUME CS:CODE,DS:DATA,ES:DATASTART: MOV AX,DATAMOV DS,AXMOV ES,AXLEA SI,SRC_MESSLEA DI,NEW_LOCMOV CX,6CLD ;DF置0CMP SI,DI ;源数据块首址〈目的块首址时,从数据块末地址开始传送数据。
JL NEXT1 ;如果SI小于DI,则跳转到NEXT1(否则直接执行NEXT2) NEXT2: REP MOVSBNEXT1: ADD SI,CX ; SI=SI+CX-1 从末地址开始传递数据DEC SI ;ADD DI,CX ;DI+=DI+CX-1DEC DI ;STD ; DF置1JMP NEXT2 ;CODE ENDSEND START结果显示:将3500H开始的1,2,3,4,5,6复制到3510H开始的地址。
汇编语言程序设计实验报告三(子程序设计实验)
汇编语言程序设计实验报告三(子程序设计实验)汇编语言程序设计实验报告三(子程序设计实验)实验目的掌握主程序与子程序之间的调用关系及其调用方法。
掌握子程序调用过程中近程调用与远程调用的区别。
熟练掌握码型变换的程序。
实验内容从键盘输入二位非压缩BCD数,存入AX寄存器中,编程实现将其转换为二进制数,并在屏幕上显示。
要求码型转换程序用远程子程序编写,字符显示用近程子程序编写。
数据可循环输入,遇‘00’结束。
实验准备预习子程序设计的基本方法,根据实验内容要求编写出实验用程序。
熟悉键盘输入和字符显示的程序段的编制。
实验步骤编辑、汇编源程序,生成可执行文件。
执行程序,检查输入、输出结果,看是否正确。
如不正确,用DEBUG检查,修改源程序,再汇编、运行,直到程序正确为止。
用DEBUG的T命令或P命令跟踪程序的执行,观察在远程和近程调用过程中,堆栈的变化情况。
实验报告要求分析近程调用和远程调用的主要区别。
用DEBUG命令观察执行过程有何不同。
分析实验结果及所遇到的问题的解决方法。
程序流程图开始TRAN程序标准序开始读入十进制数据放AX中AXAXAND0F0FH是00?YBLALN调用转换子程序结束AL左移3位回车、换行BL左移1位于ALAL+BL主程序流程图ALAL+AHRET转换子程序TRAN流程图程序清单STASEGMENTSTACK’STACK’DB100DUP(0)STAENDS GSAGSEGMENTPARA‘CODE’ASSUMECS:CSAG MAINPROCFARSTRAT:PUSHDSSUBAX,AXPUSHAXREV:MOVAH,1INT21HMOVBL,ALINT21HMOVAH,ALMOVAL,BLCMPAX,3030H JEENDTRAN CALLNEARPTRTRAN CALLFARPTRCON MOVAL,0DH CALLFARPTRDISP MOVAL,0AH CALLFARPTRDISP MOVAL,0AH CALLFARPTRDISP JMPREV ENDTRAN:RET MAINENDP TRANPROCNEAR ANDAX,0F0FHMOVBL,ALMOVBL,ALMOVCL,3SHLAL,CLMOVCL,1SHLBL,CLADDAL,BLADDAL,AHRETTRANENDPCSAGENDS CSBGSEGMENTPARA’CODE’ASSUMECS:CSBG CONPROCFARPUSHAXMOVCL,4 SHRAL,CL ADDAL,30H CMPAL,39H JBECON2 ADDAL,7CON2:PUSHAX MOVAL,0DH CALLFARPTRDISP MOVAL,OAH CALLFARPTRDISP POPAX CALLFARPTRDISP POPAX ANDAL,0FHADDAL,30H CMPAL,39H JBECON1ADDAL,7CON1:CALLFARPTRDISP RETCONEDNP DISPPROCFAR PUSHBXMOVBX,0MOVAH,14INT10HPOPBXRETDISPENDPCSBGENDS ENDSTART。
《汇编语言程序设计》试卷 福建农林大学解析
第4篇模拟试卷试卷一一、单项选择题(本大题共15小题,每小题2分,共30分)1.与MOV BX, OFFSET V AR指令完全等效的指令是()。
(A)MOV BX, V AR (B)LDS BX, V AR(C)LES BX, V AR (D)LEA BX, V AR2.DEBUG中的执行一段子程序的命令是()。
(A)D (B)T (C)P (D)U3.不能作为地址指针的寄存器是()。
(A)CX (B)BX (C)DI (D)SI4.已知, (AX)=0F234H,执行OR AX, 963FH后,则SF,CF的值为()。
(A)SF=1,CF=1 (B)SF=1,CF=0(C)SF=0,CF=1 (D)SF=0,CF=05.AL=11011011B ,CL=2,执行SAR AL, CL后,AL寄存器的内容是()。
(A)00110110 (B)01101100(C)01101111 (D)111101106.下面两个传送指令语句中源操作数寻址方式是()。
V AR1 DW 32HV AR2=32H......MOV AX, V AR1MOV BX, V AR2(A)都是立即数寻址(B)立即数寻址,直接寻址(C)直接寻址,立即数寻址(D)都是直接寻址7.变量具有()。
(A)偏移属性(B)符号属性(C)段属性(D)段属性和偏移属性8.寄存器间接寻址方式中,操作数在()中。
(A)通用寄存器(B)堆栈(C)内存单元(D)段寄存器9.下列对END语句的叙述正确的是()。
(A)END是一可执行语句(B)END表示程序执行到此结束(C)END表示源程序到此结束(D)END在汇编后产生机器码10.下列叙述不正确的是()。
(A)存储单元与逻辑地址之间的关系是一一对应的(B)存储单元与物理地址之间是一一对应的(C)一个逻辑地址对应一个存储单元(D)一个存储单元可以用不同的段地址和偏移地址表示11.下列指令合法的是()。
福建农林大学汇编语言实验报告
3.实验内容及实验数据记录
1)输入程序观察寄存器变化使用DEBUG,将下面的程序段写入内存,逐条执行,观察每条指令执行后,CPU中相关寄存器的内容变化。注意用T命令执行时,CS: IP寄存器的内容
DA2 DB 0AH, 0DH
COUNT EQU $-DA1
DATAENDS
END
(2)输入有错误的文件,修改错误语句。(MASM没有出现错误即可。不
必连接、运行。)
DATASEGMENT
VAR1DB 0, 25, ODH, 300
VAR2DB 12H, A4H, 6BH
VAR3DB ’ABCDEF’
DATASENDS
CODESSEGMENT
ASSUMECS: CODES, DS: DATAS
START:MOVAX, DATAS
MOVDS, AX
LEADX, STRING
MOVAH, 9
INT21H
MOVAH, 4CH
INT21H
CODESENDS
ENDSTART
1.算法描述及实验步骤
编写各代码并存储为源程序asm文件,对其进行汇编、连接。
v.输入:link 1.asm
vi.在系统出现的提示中输入:
Run file [1.exe]:输入1
List file[nul.map]:回车键
libraries[.lib]:回车键
vii.出现“no stack segment”警告,不理会。生成了1.exe可执行文件
汇编语言实验报告(子程序)
西安财经学院信息学院
《汇编语言程序设计》 实验报告
实验名 子程序结构程序设计 实验室 实验楼403 实验日期 2013/06/09 一、实验目的及要求
1. 学习子程序的编写,主子程序的调用
2. 不同模块间程序的调用和调试
二、实验环境
硬件环境:一台微型计算机; 软件环境:windows 7 链接程序:LINK.EXE
调试环境:DOSBOX 虚拟平台。
三、实验内容
数据段中的
6个字符,“ABCDEF ”,调用子程序将其逐个显示出来。
子程
序的功能是显示一个字符。
四、实验过程
1. 通过编译程序、链接程序分别生成OBJ 和EXE 文件后,直接运行查看结果
如下:
2. 反汇编,查看程序的指令,如下所示:
姓名 学号 10051704 班级 计本1004班 指导教师 张娟
3. 用-d 查看数据段内存放的数据:
4. 单步执行
查看堆栈段的内容:继续单步执行:
五、源程序清单
程序源代码如下:
DATA SEGMENT
MAG DB ‘ABC DEF’
DATA ENDS
CODE SEGMENT
ASSUME CS: CODE, DS: DATA
START: MOV AX, DATA
MOV DS, AX
MOV SI, 0
MOV CX, 6
LL: MOV DL, MAG[SI]
CALL MADD
INC SI
LOOP LL
MOV AH, 4CH
INT 21H
MADD PROC。
福州大学汇编实验答案参考【最新】
codeends end main附加工作总结一篇,不需要的朋友下载后可以编辑删除,谢谢安全生产监管执法工作方案5篇第一篇一、指导思想2014年,全区安全生产监管执法工作要以科学发展观为指导,全面贯彻落实《国务院关于进一步加强企业安全生产工作的通知》和《省政府关于进一步加强企业安全生产工作的意见》文件精神,进一步规范安全生产监管执法行为,落实行政执法责任制,提高依法行政水平,严厉打击安全生产领域的非法违法行为,及时消除事故隐患,促进全区安全生产形势进一步稳定好转。
二、工作目标通过安全生产监管执法计划的实施,生产经营单位安全生产主体责任进一步落实,全区安全生产杜绝重特大事故,遏制较大生产安全事故,减少一般生产安全事故,各类生产安全事故指标控制在市政府下达的考核指标内。
全区安全生产高危领域和重点监管单位的监管面达到100%。
三、主要任务(一)执法检查工作日安排我局现有在册行政执法人员14人。
按照《国家安全监管总局关于印发安全生产监管年度执法工作计划编制办法的通知》要求,2014年我局总法定工作日为3500个工作日,其中:综合执法工作日为2000个工作日;专项执法检查工作日为800个工作日;非执法工作日为700个工作日。
在综合执法工作日中,实施行政许可为550个执法工作日;开展生产安全事故调查和处理为850个执法工作日;开展安全生产举报查处为200个执法工作日;重大安全生产隐患排查报告的受理、登记建档、跟踪监控、督促整改等为200个执法工作日;开展机动执法为200个执法工作日等。
(二)监管执法计划任务分解按照分级负责、属地监管的原则,对危险化学品、冶金、烟花爆竹等行业生产经营单位的生产现场安全监督检查,根据生产经营单位上年度安全等级确定现场检查的频次;对其他生产经营单位的生产现场安全监督检查,原则上组织1次安全执法检查。
根据专项检查工作日确定全年开展执法检查的生产经营单位数量是160家。
其中:安全监督管理科28家;危险化学品安全监督管理科46家;职业安全健康监督管理科27家;监察大队59家。
实验的四子程序设计
实验四子程序设计一.实验目的: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、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
福建农林大学计算机与信息学院实验报告系:计算机专业:计算机科学与技术年级:2014姓名学号:实验室号__ 计算机号实验时间:2016-10-29指导教师签字:刘庆连成绩:实验四子程序设计1.实验目的(1)学习子程序的编写,主子程序的调用;(2)不同模块间程序的调用和调试。
2.实验内容1)数据段中的3个字符,调用子程序将其逐个显示出来。
子程序的功能是显示一个字符。
单步执行,对CALL语句和RET语句观察SP,IP的变化,并用D命令查看栈顶的内容。
DATA SEGMENTMAG DB ‘ABC’DATA ENDSCODE SEGMENTASSUME CS: CODE, DS: DA TASTART: MOV AX, DA TAMOV DS, AXMOV SI, 0MOV CX, 3LL: MOV DL, MAG[SI]CALL MADDINC SILOOP LLMOV AH, 4CHINT 21HMADD PROCMOV AH, 02HINT 21HRETMADD ENDPCODE ENDSEND START2)阅读S31.ASM和S32.ASM两个模块中的程序,并分别汇编,然后连接成一个可执行文件S31.EXE。
具体步骤如下:MASM S31.ASM(分别汇编)MASM S32.ASMLINK S31 S32 (将两个文件连接成为一个文件名为S31)S31.EXE (运行)3)编程:利用主程序调用子程序,比较BUF1和BUF2缓冲区中不相等的字符,并将不相等的字符显示出来。
(也可以将找到的不相等字符逐个显示,用INT 21H的02功能调用)4)编程:子程序搜索指定字符缓冲区中是否有N,如果有用Y替代。
调用子程序将BUF1,BUF2,BUF3中的N全部用Y替代。
附源程序:NAME S31.ASM不同模块间的段间调用。
从键盘输入2位非压缩BCD数,存入AX寄存器中。
为了将其转换为二进制数,编写一个子程序TRAN。
显示子程序DISP完成将16进制数转换为对应的ASCII码并显示该字符,显示子程序在另一模块S32中。
输入数据为00时结束。
EXTRN DISP: FARCODE SEGMENT PARA ‘CODE’ASSUME CS: CODESTART: MOV AH, 01HINT 21HMOV BL, ALINT 21HMOV AH, ALMOV AL, BLCMP AX, 3030HJE EXITCALL NEAR PTR TRANCALL FAR PTR dispJMP STARTEXIT: MOV AH, 4CHINT 21HTRAN PROC NEAR ;将输入的ASCII码转换成2进制数AND AX, 0F0FH ;将ASCII码转换成非压缩BCD码,;高位在AL中MOV BL, AHMOV CL, 10DMUL CLADD AL, BLRETTRAN ENDPCODE ENDSEND STARTNAME S32.ASMPUBLIC DISPCODE1 SEGMENT PARA ‘CODE’ASSUME CS: CODE1DISP PROC FARMOV BL, ALMOV BH, 00MOV CH, 4ROLL: MOV CL, 4ROL BX, CLMOV DL, BLAND DL, 0FHCMP DL, 9JBE NEXT1ADD DL, 07HNEXT1: ADD DL, 30HMOV AH, 02HINT 21HDEC CHJNZ ROLLRETDISP ENDPCODE1 ENDSEND5)编一个子程序:输入一个字符,显示出来。
6)编一个子程序:输入一个字符串,显示出来。
4.算法描述及实验步骤题1:依题输入相应的代码如下,运行->调试->单步执行,对CALL语句和RET语句观察SP,IP的变化,并用D命令查看栈顶的内容。
题3及4,5,6按要求编写即可5.调试过程无6. 实验结果【题一】实验结果如下有上图可知,当程序运行到call语句之前,SP一直保持0000不变,而IP则一直在增加。
继续单步执行程序由上图,当程序在RET语句之前运行时,SP、IP每次都是分别按2和1递增,当运行到RET语句时,SP还是按照2来递增,而IP出现了变化,这次却减少了很多,说明指针回撤执行下一个循环。
【题二】按要求把s31 s32 分别汇编连接形成一个s31.exe文件,如下汇编s31汇编s32Link s31 s32形成一个s31.exe的文件【题三】编写代码如下运行结果如下图BUF1=’HELLO WORLD!’BUF2=’HOLLO WOLLD~’比较可知BUF1与BUF2中不同的字符有ER!,结果与预期一致【题四】编写代码如下运行结果如下图分析:有图可知,结果将BUF1和BUF2中的n改为了y完成题目要求. 【题五】编一个子程序:输入一个字符,显示出来编写代码如下【题六】编一个子程序:输入一个字符串,显示出来编写代码如下7. 总结通过本次上机实验,学会了子程序的编写和主子程序的调用,并且掌握了在不同模块间程序的调用和调试。
在本次实验中,再一次加深了对汇编程序的汇编以及连接运行的方法。
附录:【题3代码】DATA SEGMENTBUF1 DB'HELLO WORLD!'LEN =$-BUF1BUF2 DB'HOLLO WOLLD~'DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART: MOV AX, DATAMOV DS, AXLEA SI, BUF1LEA DI, BUF2MOV CX,LENCALL CMPPMOV AH, 4CHINT 21HCMPP PROC NEAR ;子程序L1:MOV DL,[SI]CMP DL,[DI]JZ NEXTMOV AH,02HINT 21HNEXT:INC SIINC DILOOP L1RET ;子程序返回CMPP ENDPCODE ENDSEND START【题4代码】DATA SEGMENTBUF1 DB'aaanaannaaan',0ah,0dh,'$'LEN1 =$-BUF1BUF2 DB'bbnnnbbbbnnn', '$'LEN2 =$-BUF2DATA ENDSCODE SEGMENTASSUME CS: CODE, DS: DATA START: MOV AX, DATAMOV D S, AXLEA SI, BUF1MOV C X, LEN1CALL CMMPLEA SI, BUF2MOV C X, LEN2CALL CMMPMOV A H, 4CHINT 21HCMMP PROCMOV DX, SICMP1:CMP BYTE PTR[SI], 'n'JNE NOTNMOV A L, 'y'MOV[SI], ALNOTN:INC SILOOP CMP1MOV A H, 09H ;显示字符串INT 21HRETCMMP ENDPCODE ENDSEND START【题5代码】STACKS SEGMENT STACKDW128 DUP(?)STACKS ENDSCSEG SEGMENT PARA PUBLIC 'CODE'ASSUME CS:CSEGSTART: MOV AH,01INT 21HMOV DL,ALMOV AH,02INT 21HMOV AL,0MOV AH,4CHINT 21HCSEG ENDSEND START【题6代码】STACKS SEGMENT STACKDW 128 DUP(?)STACKS ENDSDSEG SEGMENTMSG DB 0DH,0AH,'$'BUF DB 20,?,20 DUP(?)DSEG ENDSCSEG SEGMENT PARA PUBLIC 'CODE' ASSUME CS:CSEG,DS:DSEGSTART: MOV AX,DSEGMOV DS,AX LEA DX,BUF MOV AH,0AH INT 21HLEA DX,MSG MOV AH,09 INT 21HLEA DX,BUF+2 INT 21H MOV AL,0 MOV AH,4CH INT 21H CSEG ENDSEND START。