汇编实验 子程序结构和设计
- 格式:doc
- 大小:96.50 KB
- 文档页数:8
实验3 顺序结构程序设计一、实验目的学习数据传送指令和算术运算指令的用法;掌握数据定义伪指令的格式,会用DEBUG 中的D命令观察DB、DW、DD存储数据的格式;熟悉汇编语言的基本框架,掌握编写汇编语言程序的基本方法。
二、示例源程序如下:data segmenta db 10b db 20d db 30,40,50data endscode segmentassume cs:code,ds:datastart:mov ax,datamov ds,axmov al,d+1add al,dmov a,almov al,d+1add al,d+2mov b,aladd d,10add d+1,20add d+2,30exit: mov ah,4chint 21hcode endsend start阅读程序,试问程序执行到exit时,字节单元a、b、d、d+1、d+2中的内容各是什么?(结合程序分析和实验实际结果截图)结果:a:46b:5Ad:28d+1:3Cd+2:50验证:分析出结果,并上机验证。
三、实验题求表达式Y=A*X2+B*X+C的值,已知a、b、d分别存放在dataa、datab、datad字节单元,X存放在TABLE字节单元,结果Y放入RESULT字单元。
要求:①在DEBUG下多次修改X的值,观察执行结果Y四、实验报告写出程序清单,记录运行结果;总结DEBUG中U、E、D、T、G命令的功能。
程序代码:data segmentdataa db 1datab db 3datad db 5table db 2result dw?data endscode segmentassume cs:code,ds:data start:mov ax,datamov ds,axmov al,tablemul almul dataacbwmov bx,axmov al,tablemul databadd bx,axmov al,datadcbwadd bx,axmov result,bxexit: mov ah,4chint 21hcode endsend start运行结果:①在DEBUG下多次修改X的值,观察执行结果Y更改X的值为3验算正确更改X值为5更改X的值为0总结DEBUG中U、E、D、T、G命令的功能。
汇编语言程序掌握子程序的设计汇编语言程序掌握子程序的设计子程序的定义和使用,我们需要了解子程序的定义和使用。
在汇编语言中,子程序通常由一段带有入口点和出口点的代码块组成。
入口点是子程序被调用的位置,而出口点是子程序执行完毕后返回的位置。
下面是一个简单的子程序的定义示例:; 子程序的说明subroutine:; 子程序的代码逻辑ret在上面的示例中,`subroutine` 是子程序的入口点,`ret` 是子程序的出口点。
当程序执行到 `ret` 指令时,将返回到调用子程序的位置继续执行后续的代码。
调用子程序的方法是使用 `call` 指令,以指令的形式告诉处理器需要调用的子程序入口点的位置。
例如:call subroutine这将会跳转到 `subroutine` 的入口点开始执行子程序的代码,然后在子程序执行完毕后返回到 `call` 指令的下一条指令继续执行后续的代码。
子程序的设计原则设计一个高效和可重用的子程序需要遵循一些设计原则:1. 单一责任原则一个子程序应该只负责一个特定的任务或功能。
这样可以使子程序的设计更加清晰和可重用。
2. 输入和输出参数子程序应该通过参数来接收输入的数据,并将处理后的数据通过参数返回。
这样可以增加子程序的灵活性和可重用性。
3. 注释和文档为子程序添加详细的注释和文档,可以使其他程序员更容易理解和使用子程序。
注释应该清晰地描述子程序的功能、输入和输出参数以及注意事项。
4. 错误处理子程序应该具备良好的错误处理机制,它应该能够在遇到错误时返回错误码或抛出异常。
这样可以提高程序的可靠性和可维护性。
5. 可测试性设计可测试的子程序是很重要的。
你可以为每个子程序编写对应的测试用例,以确保子程序的正确性和稳定性。
子程序的优化技巧除了以上的设计原则,还有一些优化技巧可以提高子程序的性能:1. 寄存器的使用在子程序中尽可能地使用寄存器进行计算和存储临时数据,而不是使用内存。
因为寄存器的读写速度要远快于内存,可以显著提高程序的执行效率。
实验四子程序设计一、实验目的(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)说明用寄存器传送参数的过程及其具体方法,各子程序的应用。
矿产资源开发利用方案编写内容要求及审查大纲
矿产资源开发利用方案编写内容要求及《矿产资源开发利用方案》审查大纲一、概述
㈠矿区位置、隶属关系和企业性质。
如为改扩建矿山, 应说明矿山现状、
特点及存在的主要问题。
㈡编制依据
(1简述项目前期工作进展情况及与有关方面对项目的意向性协议情况。
(2 列出开发利用方案编制所依据的主要基础性资料的名称。
如经储量管理部门认定的矿区地质勘探报告、选矿试验报告、加工利用试验报告、工程地质初评资料、矿区水文资料和供水资料等。
对改、扩建矿山应有生产实际资料, 如矿山总平面现状图、矿床开拓系统图、采场现状图和主要采选设备清单等。
二、矿产品需求现状和预测
㈠该矿产在国内需求情况和市场供应情况
1、矿产品现状及加工利用趋向。
2、国内近、远期的需求量及主要销向预测。
㈡产品价格分析
1、国内矿产品价格现状。
2、矿产品价格稳定性及变化趋势。
三、矿产资源概况
㈠矿区总体概况
1、矿区总体规划情况。
2、矿区矿产资源概况。
3、该设计与矿区总体开发的关系。
㈡该设计项目的资源概况
1、矿床地质及构造特征。
2、矿床开采技术条件及水文地质条件。
沈阳工程学院学生实验报告实验室名称:微机原理实验室实验课程名称:实验项目名称:子程序设计及DOS调用实验实验日期:20 年月日班级:姓名:学号:指导教师:王德君、李贞批阅教师:成绩:一.实验目的1.学习子程序的定义和调用方法。
2.学习DOS功能调用的使用方法。
二.实验设备PC机一台,TD-PITE微机原理实验教学系统一台。
三.实验内容程序1:主程序从键盘读入一个小写字母,子程序将其转换成大写字母,并输出。
请将程序代码补充完整。
DSEG SEGMENTCHAR DB ?DSEG ENDSCODE SEGMENTASSUME CS:CODE, DS:DSEG START:MOV AX,DSEGMOV DS,AX( MOV AL,CHAR )INT 21H( CALL CAPITAL )MOV AH,4CHINT 21HCAPITAL PROCSUB AL,( 20H ) ;转换为大写字母MOV DL,AL ;输出大写字母MOV AH,2INT 21H( RET )CAPITAL ENDSCODE ENDSEND START程序2:定义一个以“$”结尾的字符串,长度不超过99,子程序求该字符串长度(不包括“$”),主程序显示结果。
请将程序代码补充完整。
DA TA SEGMENTMESSAGE DB 'This is a string','$' DA TA ENDSCODE SEGMENTASSUME CS:CODE, DS:DATA GETLENGTH PROC ;定义子程序XOR AX, AXNEXT: CMP [BX], ( 0 )JZ DONE( INC AX ) ;串长度加1INC BXJMP NEXTDONE:RETGETLENGTH ENDPSTART:MOV AX, DATAMOV DS, AXLEA BX, MESSAGECALL GETLENGTHMOV BL, 10;通过AX除以10分别得到十位和个位数字(接下页)子程序设计及DOS调用实验DIV BLADD AX, 3030H ;商和余.数(十位数字和个位数字)转换为ASCII码MOV BX, AX ;☆MOV DL, BL( MOV AH,02H )INT 21H ;输出十位数字( MOV DH,BH ) ; (接右侧)MOV AH, 02HINT 21H ;输出个位数字MOV AH, 4CHINT 21HCODE ENDSEND START四.实验步骤1.运行Wmd86调试软件,编写程序1,经编译、( 链接)无误后,进入调试状态。
实验报告课程名称汇编语言程序设计实验项目实验三、子程序结构和设计实验仪器微机系统、汇编调试环境系别计算机科学与技术专业计算机科学与技术班级/学号计科1103/2011011111 学生姓名房皓实验日期2013-6-2成绩指导教师胡信裕实验三子程序结构和设计一、实验目的1.进一步熟悉、掌握顺序结构、分支结构、循环结构程序设计和调试。
2.熟悉、掌握子程序设计和调试;3.熟悉、掌握键盘输入和屏幕输出的中断调用方法和应用。
二、实验要求1.Windows操作系统并具有命令提示符操作界面的计算机,且系统内安装有汇编语言编程环境。
2.在开始本实验之前,复习教科书的相关内容,并预先写出相应的源程序。
3.通过汇编IDE上机调试,注意观察,并记录下现象。
三、实验内容功能要求:从键盘上以16进制数的形式输入20个无符号数(0~255),以回车作为一个数输入的结束。
将它们以16进制数的形式在屏幕上按输入顺序显示,并换一行后将它们由大到小排序显示,数之间用空格隔开。
【可键入任意字符,但只对十六进制数处理显示】。
1.运用文本编辑器编辑实验源程序(EXP3.asm);实验程序设计如下:Data segmentarray db20dup(?)mess1 db0dh,0ah,'PRE_Enter:',0dh,0ah,'$'mess2 db0dh,0ah,'SORTED:',0dh,0ah,'$';a_len equ ($-array)/2Data endsCode segmentAssume ds:data,cs:codeMain proc farstart: mov ax,datamov ds,axcall getarray ;调用getarray子程序mov ah,9;显示提示信息mess1:mov dx,offset mess1int21hcall output ;调用output子程序,输出排序前的序列call disp0d0a ;调用disp0d0a子程序,输出回车换行call disp0d0acall sort ;调用sort子程序,由大到小排序mov ah,9;显示提示信息mess2:mov dx,offset mess2int21hcall output ;调用output子程序,输出排序后的序列int21hdisp0d0a proc;子程序disp0d0a,输出回车换行push axpush dxmov dl,0dhmov ah,2int21hmov dl,0ahmov ah,2int21hpop dxpop axretdisp0d0a endpgetarray proc;子程序getarray,输入20个数据push di;保护现场push axmov di,0mov cx,20;循环20次lop1:mov bx,0mov ax,0r_key: mov ah,1int21h;输入一个字符cmp al,0dh;比较是否是回车jz set ;回车则转至setcmp al,'0';对输入字符进行处理jl r_keycmp al,'9'jle d0_9cmp al,'A'jl r_keycmp al,'F'jle da_fcmp al,'a'jl r_keycmp al,'f'jle da__fjmp r_keyd0_9: ;处理0~9,变成十进制sub al,30hda_f: ;处理a~f,变成十进制sub al,37hjmp add_toda__f: ;处理a~f,变成十进制sub al,57hjmp add_toadd_to: ;累加shl bx,4;bx逻辑左移4位mov ah,0add bx,ax;全都累加在bx中jmp r_keyset:mov array[di],bl;存入数据inc dimov ah,2;mov dl,0dh;int 21hmov dl,0ahint21h;回车换行;mov dl,bl;add al,30h;mov dh,0;int 21hloop lop1pop di;恢复pop axretgetarray endpoutput proc;子程序output,输出数据push dipush dxmov dx,0mov di,0mov cx,20lop2: mov bl,array[di] ;将已输入的数据送入bx mov dl,blshr dl,4;高位;add dl,37h;and dl,0fh;add dl,30hjbe d_9cmp dl,0fhjbe d_fdisp1: mov ah,2int21h;显示高位mov dl,bland dl,0fh;低位;add dl,37hcmp dl,09hjbe d_9_1cmp dl,0fhjbe d_f_1disp2: mov ah,2int21h;显示低位inc dimov dl,20hmov ah,2int21h;输出空格loop lop2pop dxpop dijmp backd_9: add dl,30h;处理高位0~9 jmp disp1d_f: add dl,37h;处理高位a~f jmp disp1d_9_1: add dl,30h;处理低位0~9 jmp disp2d_f_1: add dl,37h;处理低位0~9 jmp disp2back: retoutput endpsort procpush bxpush cxpush sipush axmov ax,0mov bx,0lp1: mov bx,1;设置标志bx=1 mov cx,20;设置循环次数cx=20dec cx;;mov si,offset arraylp2: mov al,array[si] ;取数据;mov dx,axcmp al,array[si+1];cmp al,ah ;比较相邻的两个数jae con ;若大于等于,则不需要互换,继续下一个xchg al,array[si+1];xchg al,ah ;若小于,互换mov array[si],al;存入换后的数据mov bx,0;使标志bx=0con: inc siloop lp2cmp bx,1jz backtojmp lp1backto: pop axpop sipop cxpop bxretsort endpMain endpCode endsEnd main2.在IDE操作环境下,对源程序(EXP3.asm)进行编译和连接,生成生成链接文件(EXP3.obj)和可执行文件(EXP3.exe);3.运行IDE操作环境下的调试命令,调试可执行文件(EXP3.exe);4.运行IDE操作环境下的执行命令,运行可执行文件(EXP3.exe),结果为:测试数据:1、2、3、4、5、6、7、8、9、0、1w2、a、b、c、d、e3、f、ws34、33、2(不接受非十六进制字符)输出数据:E3、34、33、12、0F、0D、0C、0B、0A、09、08、07、06、05、04、03、02、01、00运行结果截图:实验结果符合实验程序设计要求。
四、实验总结1.对实验过程中所涉及的主要操作进行总结;实验操作流程:a 运用文本编辑器编辑实验源程序(EXP3.asm);b在IDE操作环境下,对源程序(EXP3.asm)进行编译和连接,生成生成链接文件(EXP3.obj)和可执行文件(EXP3.exe);c运行IDE操作环境下的调试命令,调试可执行文件(EXP3.exe);d运行IDE操作环境下的执行命令,运行可执行文件(EXP3.exe)2.对实验过程中出现的主要问题进行分析并给出解决方案说明;a 实验结果输出不合理,有明显偏差。
原因是在使用寄存器前没有对寄存器初始化,或者寄存器内容被更改,例如利用CX进行循环计数时,在使用前没有对CX赋初值或CX另被调用导致其内容改变。
解决方法就是在最靠近循环的位置对CX初始化。
b 子程序getarray的定义出现问题,原因是没有加proc,将子程序的头一行改为getarray proc就解决了。
c 程序不能成功运行,运行到子程序就停止,原因是对某些寄存器进行压栈处理保存现场后忘记出栈恢复现场,恢复现场后就解决了。
d 数据在输入时出现问题,按回车后不换行而是回到本行行首,解决方法是在输入数据回显后在显示换行。
e 在用冒泡法排序时,比较相邻两个数的大小,在需要交换时,才用第三个数作为中转,可以使程序简洁易懂。
f 程序出现问题,出现非法字符,原因在比较一个数后,对si加了2,对于字节变量加1就行,改为加1后问题解决。
3.对比设计要求,对实验结果及完成情况进行说明;实验内容是从键盘上以16进制数的形式输入20个无符号数(0~255),以回车作为一个数输入的结束。
将它们以16进制数的形式在屏幕上按输入顺序显示,并换一行后将它们由大到小排序显示,数之间用空格隔开。
实验结果符合程序设计要求。
4.实验后的体会、感想和建议。
通过本次实验,我锻炼了自己的操作能力并对理论知识有了进一步的理解:a 进一步熟悉、掌握了顺序结构、分支结构、循环结构程序的设计和调试;b 熟悉、掌握了子程序的设计和调试;c熟悉、掌握键盘输入和屏幕输出的中断调用方法和应用;d 了解并掌握了冒泡法排序的主要操作步骤,对数据排序有了进一步的理解;e 进一步学习并运用了单步执行观察寄存器状态以查错的调试方法。