版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、HYPer 程序设计方法 概述顺序程序设计分支程序设计循环程序设计子程序设计模块化程序设计高级汇编语言技术HYPer目录 一.概述汇编语言程序设计的一般步骤流程图HYPer 汇编语言程序设计的一般步骤1分析问题,确定算法2绘制流程图3分配存储空间和工作单元4. 根据流程图编制程序5调试程序HYPer 流程图1流程图的概念流程图是由特定的几何图形、指向线、文字说明来表示数据处理的步骤,形象描述逻辑控制结构以及数据流程的示意图。流程图具有简洁、明了、直观的特点。2流程图符号表示(1)起止框:表示程序的开始和结束。起止框HYPer(2)判断框 (3)处理框 (4)调用框 HYPer(5)指向线 (6
2、)连接框 HYPer二.顺序程序设计下面举例说明顺序程序的设计。【例4.1】试编写一程序计算以下表达式的值。=(v-(*+-540)/x式中x、v均为有符号字数据。设、的值存放在字变量、V中,结果存放在双字变量之中,程序的流程图如下图所示。HYPer源程序如下:DATASEGMENTXDW200YDW100ZDW3000VDW10000WDW2 DUP(?)DATAENDSSTACKSEGMENT STACK DB 200 DUP(0)STACKENDSCODESEGMENTASSUME DS:DATA,CS:CODE,SS:STACKSTART:MOVAX,DATAMOVDS,AX;DATA
3、AXMOVAX,X IMULY;(X)*(Y)DX:AXMOVCX,AXMOVBX,DX;(DX:AX)(BX:CX)MOVAX,ZCWD;(Z)符号扩展ADDCX,AXADCBX,DX;(BX:CX)+(DX:AX)(BX:CX)SUBCX,540SBBBX,0;(BX:CX)-540(BX:CX)MOVAX,V CWD;(V)符号扩展SUBAX,CXSBBDX,BX;(DX:AX)-(BX:CX)(DX:AX)IDIVX;(DX:AX)/XMOVW,AX;商WMOVW+2,DX;余数DXW+2MOVAH,4CHINT21HCODEENDS;退出DOS 状态ENDSTART【例4.2】【例4
4、.2】已知某班学生的英语成绩按学号(从1开始)从小到大的顺序排列在TAB表中,要查的学生的学号放在变量NO中,查表结果放在变量ENGLISH中。编写程序如下:STACKSEGMENT STACKDB 200 DUP(0)STACKENDSDATASEGMENTTABDB 80,85,86,71,79,96 DB 83,56,32,66,78, 84NO DB 10ENGLISHDB?DATAENDSCODESEGMENT ASSUME DS:DATA,SS:STACK,CS:CODEBEGIN: MOVAX,DATAMOVDS ,AXLEABX,TAB MOVAL,NODECALXLATB ;
5、 albx+alMOVENGLISH,ALMOVAH,4CHINT21HCODEENDSENDBEGIN4.3 分支程序设计4.3.1 用条件转移指令实现程序分支4.3.2 用跳转表实现多路分支返回本章首页4.3.1 用条件转移指令实现程序分支【例4.3】编写计算下面函数值的程序: 1X0Y= 0X=0 -1X设输入数据为X、输出数据Y,且皆为字节变量。程序流程图如图4.2所示。程序如下:DATASEGMENTX DB -10Y DB ?DATAENDSSTACKSEGMENT STACK DB 200 DUP(0)STACKENDSCODESEGMENTASSUME DS:DATA,SS:S
6、TACK,CS:CODESTART:MOVAX,DATA MOVDS,AX CMPX,0;与0进行比较 JGEA1;X0转A1 MOVY,-1;X 0时,-1Y JMPEXITA1: JGA2;X0转A2 MOVY,0;X=0时,0Y JMPEXITA2: MOVY,1;X0,1Y EXIT: MOVAH,4CH INT21H CODE ENDS ENDSTART MOVDS,AX CMPX,0;与0进行比较 JGEA1;X0转A1 MOVY,-1;X 0时,-1Y JMPEXITA1: JGA2;X0转A2 MOVY,0;X=0时,0Y JMPEXITA2: MOVY,1;X0,1Y EXI
7、T: MOVAH,4CH INT21H CODE ENDS ENDSTART图4.2 分支运算程序流程图【例4.4】 【例4.4】试编一程序,求三个带符号字数据中的最大值,并将最大值存入MAX字单元中。设三个带符号数分别在三个字变量X、Y、Z中存储。程序流程图如图4.3所示 图4.3例4.4程序流程图 程序如下:STACSEGMENT STACK DB 200 DUP(0)STACKENDSDATASEGMENTX DW 00ABHY DW 5Z DW 200MAXDW ?DATAENDSCODESEGMENT ASSUME DS:DATA,SS:STACK,CS:CODE START: MO
8、VAX,DATA MOVDS,AX MOVAX,X CMPAX,Y;XY? JGL1 MOVAX,Y;YZ? CMPAX,Z JGEXITL2: MOVAX,Z JMPEXIT L1:CMPAX,Z;XZ? JLEL2EXIT:MOVMAX,AX MOVAH,4CH INT21HCODEENDS ENDSTART返回本节4.3.2 用跳转表实现多路分支【例4.5】设某程序有8路分支,试根据给定的N值(18),将程序的执行转移到其中的一路分支。程序流程如图4.4所示。 程序如下:DATASEGMENTTABDW P1,P2,P3,P4,P5,P6,P7,P8N DB 5DATAENDSSTACK
9、SEGMENT DB 200 DUP(0)STACKENDSCODESEGMENT ASSUME DS:DATA,SS:STACK,CS:CODE START:MOVAX,DATAMOVDS,AXMOVAL,NDELALADDAL,ALMOVBM,ALMOVBH,0JMPTABBXP1:JMPEXITP2:JMPEXITP2:JMPEXITP3: JMPEXITP8:EXIT:MOVAH,4CH INT21HCODEENDS ENDSTART上述程序中的无条件转移指令的转移地址采用的是变址寻址。同理,转移地址也可以用寄存器间接寻址或基址加变址寻址,读者可自行考虑。返回本节4.4 循环程序设计4
10、.4.1 循环程序的结构4.4.2 单重循环程序设计4.4.3 多重循环程序设计返回本章首页4.4.1 循环程序的结构1初始化部分2循环体部分3循环控制部分循环程序的常见结构形式如图4.5(a)、(b)所示。返回本节4.4.2 单重循环程序设计1计数控制2条件控制1计数控制【例4.7】已知有几个元素存放在以BUF为首址的字节存贮区中,试统计其中正元素的个数。显然,每个元素为一个8位有符号二进制数,统计其中正元素的个数可用循环程序实现。其程序流程图如图4.6所示。图4.6 程序流程图 【例4.8】 【例4.8】试编写一程序,要求比较两个字符串STR1和STR所含字符是否相同,若相同则显示MATC
11、H!,若不相同则显示NO MATCH!。(程序略)其流程图如图4.7所示。 图4.7 程序流程图【例4.9】试编一个程序将字单元BUF中所含1的个数存入COUNT单元中。要测出BUF字单元所含1的个数,首先将BUF中的数送给寄存器AX,然后将AX寄存器逻辑左移一次,如果CF=1,则表明AX中的最高位为1,则计数器CL计数1次,如果CF=0,表明AX最高位为0,这样依次将最高位移入CF中去测试。移位之后,判断AX的值是否为0,如果为0则结束循环,不为0,则继续循环。其流程图如图4.8所示。2条件控制 程序如下:STACKSEGMENT STACK DB 200 DUP(0)STACKEDNSDA
12、TASEGMENTBUFDW 0011110010101011BCOUNTDB ?DATAENDSCODESEGMENT ASSUME DS:DATA,CS:CODE,SS:STACK START:MOVAX,DATAMOVDS,AXMOVAX,BUFMOVCL,0;计数器为0COPA:ANDAX,AXJEEXIT;(AX)=0,结束循环SHLAX,1;AX 左移一位JNCLOPAINCCL;产生进位,(CL)+1CLJMPLOPAEXIT:MOVCOUNT,CLMOVAH,4CHINT21HCODEENDSENDSTART返回本节4.4.3 多重循环程序设计【例4.10】在以BUF为首址的字
13、存储区中存放有N个有符号数,现需将它们按大到小的顺序排列在BUF存储区中,试编写其程序。我们采用冒泡排序算法从第一个数开始依次对相邻两个数进行比较,如次序对,则不交换两数位置;如次序不对则使这两个数交换位置。可以看出,第一遍需比较(N-1)次,此时,最小的数已经放到了最后;第二遍比较只需考虑剩下的(N-1)个数,即只需比较(N-2)次;第三遍只需比较(N-3)次,整个排序过程最多需(N-1)遍。如下面的4个数即是采用冒泡排序比较的例子。数108169032第一遍101690328第二遍169032108第三遍903216108程序流程图如图4.9所示。程序如下:DATASEGMENTBUFDW
14、 3,-4,6,7,9,2,0,-8,-9,-10,20N=(-BUF)/2DATAENDSSTACKSEGNMENT STACKDB 200 DUP(0)STACKENDSCODESEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTART:MOVAX,DATAMOVDS,AXMOVCX,NDECCXLOOP1:MOVDX,CXMOVBX,0LOOP2:MOVAX,BUFBXCMPAX,BUFBX+2JGELXCHGAX,BUFBX+2MOVBUFBX,AXL:ADDBX,2DECCXJNELOOP2MOVCX,DXLOOPLOOP1MOVAH,4CHINT21HC
15、ODEENDSENDSTART程序运行后,BUF区中的内容如下:20,9,7,6,3,2,0,-4,-8,-9,-10若要对N个无符号数按由大到小的顺序排列,只需将指令“JGE L”改为“JAE L”即可。 返回本节4.5 子程序设计4.5.1 子程序的概念4.5.2 子程序的定义4.5.3 子程序设计方法4.5.4 子程序应用举例4.5.5 子程序的嵌套与递归调用返回本章首页4.5.1 子程序的概念在程序设计中,我们会发现一些多次无规律重复的程序段或语句序列。解决此类问题一个行之有效的方法就是将它们设计成可供反复调用的独立的子程序结构,以便在需要时调用。在汇编语言中,子程序又称过程。调用子程
16、序的程序称为主调程序或主程序。 返回本节4.5.2 子程序的定义子程序的定义是由过程定义伪指令PROC和ENDP来完成的。其格式如下:过程名 PROC NEAR/FAR 过程名 ENDP其中PROC表示过程定义开始,ENDP表示过程定义结束。过程名是过程入口地址的符号表示。一般过程名同标号一样,具有三种属性,即段属性、偏移地址属性以及类型属性。 返回本节4.5.3 子程序设计方法1信息的保护与恢复2主程序与子程序参数传递方式1信息的保护与恢复例如:若子程序PROG中改变了寄存器AX,BX,CX,DX的值,则可采用如下方法保护和恢复现场。PROGPROCPUSHAXPUSHBX PUSHCX;保
17、护现场PUSHDX POPDXPOPCXPOPBX;恢复现场POPAXRET;返回断点处PROCENDP2主程序与子程序参数传递方式(1)寄存器法(2)约定单元法(3)堆栈法返回本节4.5.4 子程序应用举例【例4.12】将一个给定的二进制数按位转换成相应的ASCII码字符串,送到指定的存储单元并显示。如二进制数10010011转换成字符串为10010011。要求将转换过程写成子程序,且子程序应具有较好的通用性,而必须能实现对8倍和16倍二进制数的转换。入口参数:DX存放待转换的二进制数CX存放待转换数的位数(8位或16位)DI存放ASCII码首地址出口参数:转换后的字符串存放在以DI作指针的
18、字节存贮区中程序如下:DATASEGMENTNUM8DB93HNUM16DW0ABCDHASCBUFDB20DUP(0)DATAENDSCODESEGMENTASSUME DS:DATA,CS:CODE, SS:STACKSTART:MOVAX,DATAMOVDS,AXMOVDX,0MOVDL,NUM8;转换二进制数送DXMOVCX,8;置位数8LEADI,ASCBUF;字符串首址DICALLBTASC;调用子程序BTASCMOVDI,BYTE PTR 0DHMOVDI+1,BYTE PTR 0AH MOVDI+2,BYTE PTR $LEADX,ASCBUFMOVAH,9INT21HMOVD
19、X,NUM16MOVCX,16;置位数16LEADI,ASCBUFCALLBTASC MOVDL,BYTE PTR 0DHMOVDL+1,BYTE PTR 0AHMOVDL+2,BYTE PTR ; 显示转换后的字符串LEADX, ASCBUF MOVAH,9 INT21HBTASCPROCPUSHAX;保存AXMOVAL,0CMPCX,8;比较8位数JNEL1;直接转换16位数MOVDH,DL;8位数转换送DHL1:ROLDX,,1;DX最高位移入CFRCLAL,1;CF移入AL最低位ADDAL,30HMOVDI,ALINCDILOOPL1POPAXRETBTASCENDPCODEENDSE
20、NDSTART返回本节4.5.5 子程序的嵌套与递归调用1子程序的嵌套子程序不但可以被主程序调用,而且也可以被其他子程序调用。我们把一个子程序调用另一个子程序称为子程序的嵌套调用。2子程序的递归调用子程序的递归调用是指一个子程序直接或间接地调用自己。递归子程序一般对应于数学上对函数的递归定义,它往往能设计出效率较高的程序,完成相当复杂的计算,因而是很有用的。 【例4.15】【例4.15】试编制计算N! (N0)的程序。N!=N*(N-1)*(N-2)*1其递归定义如下:0!=1N!=N*(N-1)! (N1)计算N!的子程序FACT的流程图如图4.10所示。【例4.16】计算5!的程序示例,
21、RESULT是保存阶乘的存储单元。程序如下:STACKSEGMENT STACKDB 200 DUP(0)STACKENDSDATASEGMENTNDW 5RESULTDW ?DATAENDSCODESEGMENTASSUME CS:CODE, SS:STACK,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVAX,NCALLFACTMOVAX,RESULTMOVAH,4CHINT21HFACTPROCCMPAX,0JNEL1MOVRESULT,1JMPEXITL1:PUSHAXDECAXCALLFACTPOPAXMOVRESULTMOVRESNLT,AXEXIT:RETF
22、ACTENDPCODEENDSENDSTART返回本节4.6 模块化程序设计1PUBLIC伪指令格式:PUBLIC 符号 ,符号功能:说明其后的符号是全局符号。全局符号能被其他模块引用。2EXTRN伪指令格式:EXTRN 符号:类型 ,符号:类型功能:说明在本模块中需要引用的、由其他模块定义的符号,即外部符号。返回本章首页【例4.17】 【例4.17】用模块化程序设计方法建立两个模块MOD1 ASM和MOD2 ASM的数据通讯。NAMEMOD1EXTRNDISP:FARPUBLICSTR1,N ,BUFDATA1SEGMENTSTR1DBHOW DO YOU DO?N=$-STR1BUFDBT
23、HIS IS AN EXAMPLE OF MODULES PROGRAM DATAENDSSTACKSEGMENT STACKDB 200 DUP(0)STACKENDSCODE1SEGMENTASSUME CS:CODE1,DS:DATA1,SS:STACKSTART:MOVAX,DATAMOVDS,AXCALLDISPMOVAH,4CHINT21HCODE1ENDSENDSTARTNAMEMOD2EXTRNSTR1:BYTE,STR2:BYTE,N:ABSPUBCICDISPDATA2SEGMENTSTR2DB 81 DUP(0)DATA2ENDSCODE2SEGMENTASSUME CS
24、:CODE2,ES:DATA2DISPPROCFARMOVAX,DATA2MOVES,AXLEABX,STR1MOVCX,NLEASI,STR2NEXT:MOVAL,BXMOVES:SI,ALINCBXINCSI LOOPNEXTLEADX,BUFMOVAH,9INT21HRET DISPENDPCODE2ENDSEND4.7 高级汇编语言技术4.7.1 宏指令4.7.2 宏指令的使用过程4.7.3 宏操作符4.7.4 局部符号伪指令LOCAL4.7.5 宏库的使用4.7.6 重复汇编4.7.7 条件汇编返回本章首页4.7.1 宏指令在汇编语言程序设计过程中,可以将具有一定功能,需多次重复使用
25、,且比较短的程序段定义成一条宏指令。使用宏指令语句可以减少程序书写错误,缩短源程序长度,使源程序编写像高级语言一样清晰、简洁。特别是使用宏库后,可以提高编程效率。返回本节4.7.2 宏指令的使用过程1宏定义2宏调用3宏扩展1宏定义(1)带参宏定义宏指令名 MACRO 形参1,形参2,宏体 ENDM(2)无参宏定义宏指令 MACRO宏体ENDM2宏调用格式:宏指令名 实参1,实参2,例如:对上面的宏定义的三种调用形式为:PRINTBUF1PRINTBUF2PRINTBUF33宏扩展+ LEADX,BUF1+ MOVAH,9+ INT21H+ LEADX,BUF2+ MOVAH,9+ INT21H
26、 + LEADX,BUF3+ MOVAH,9+ INT21H 例如:上面三次宏调用,其展开的形式为: 返回本节4.7.3 宏操作符1文本操作符【例4.19】在程序中定义大小及初值不同的堆栈段。可用如下宏定义:DSTACKMACRO ASTACKSEGMENT STACKDBASTACKENDSENDM【例4.20】表达符操作%示例。DATA1MACROA, B, C, D DWA, B, CDBD DUP(0)ENDM如果宏调用为:X=10Y=20DATA1%X+2, 5,%X+Y, %Y-5DATA1X+2, 5, X+Y, Y-5则相应的宏扩展为:+DW12, 5, 30+DB15 DUP
27、(0)+DWX+2, 5, X+Y+DBY-5 DUP (0)返回本节4.7.4 局部符号伪指令LOCAL【例4.21】局部符号伪指令LOCAL应用。SUMMACROX,YLOCALLMOVCX,XMOVBX,YMOVAX,0L:ADDAX,BXINCBXLOOPLENDM如果两次调用宏指令如下:SUM100,1SUM50,1则宏扩展形式为:MOVCX,100MOVBX,1MOVAX,0?0000:ADDAX,BXINCBXLOOP ?0000MOVCX,50MOVBX,10MOVAX,0?0001:ADDAX,BX INCBXLOOP ?0001返回本节4.7.5 宏库的使用语句格式:INC
28、LUDE 库文件名假设已建立一名为MACRO.LIB的宏库,其内容如下:INPUTMACROALEADX,AMOVAH,10;10号系统功能调用INT21HENDMPRINTMACROALEADX,AMOVAH,9;9号系统功能调用INT21HENDMRETURNMACRO MOVAH,2MOVDL,0AHINT21HMOVDL,0DH;回车换行INT21HENDMOUT2MACROAMOVDL,AMOVAH,2;2号系统功能调用INT21HENDMSTACK0MACROASTACKSEGMENTSTACKDBASTACKENDSENDM现要从键盘输入一串字符到系统缓冲区,然后将字符按相反顺序
29、打印,采用调用宏库的办法,其程序如下:INCLUDEMACRO.LIBSTACK0200DUP (0) ;定义堆栈段DATASEGMENTINF01DBINPUT STRING:INF02DBOUTPUT STRING:BUFADB81DB?DB80 DUP(0)BUFBDB 81 DUP(0)DATAENDSCODESEGMENTASSUME DS:DATA,SS:STACK,CS:CODESTART:MOVAX,DATAMOVDS,AXRETURN;输出回车换行PRINTINFO1;输出字符变量INFO1代表的字符串INPUTBUFA;键盘输入字符中到缓冲区;LEASI,BUFA+1MOVCH,0MOVCL,SIADDSI,CXLEADI,BUFBNEXT:MOVAL,SIMOVDI,ALDECSIINCDILOOPNEXTMOVBYTE PTR DI,RETURN;输出回车换行P
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 电气工程师专业知识题库及答案
- 2025年内蒙古北方甄选电子商务有限公司招聘备考题库带答案详解
- 航空公司客户服务部面试题及答案
- 2025年渤海银行北京分行-风险管理部-尽责审查管理岗招聘备考题库及完整答案详解一套
- 通讯行业面试题及5G技术应用含答案
- 银行理财顾问岗位专业知识与技能测试题目集
- 游戏行业项目主管选拔试题解析
- 药师考试试题及答案
- 2025年中国社会科学杂志社总编室(研究室)公开招聘5人的备考题库及一套完整答案详解
- 电商运营主管面试题集及解析
- 煤矿采掘技术
- 游艇俱乐部圈层策划方案
- 煤矿用履带式液压钻机ZDY2300LX说明书-图文
- 2023年南通启东市邮政局招考笔试参考题库(共500题)答案详解版
- 多媒体系统维保服务投标方案
- JCT890-2017 蒸压加气混凝土墙体专用砂浆
- 深圳亚马逊超级大卖副总制定的亚马逊运营SOP计划表
- 康复治疗学Bobath技术
- 上海市九年义务教育阶段写字等级考试(一级)硬笔方格收写纸
- 南部三期污水处理厂扩建工程项目环评报告
- 强磁场对透辉石光催化性能影响的实验毕业论文
评论
0/150
提交评论