汇编语言第5章 循环与分支程序设计_第1页
汇编语言第5章 循环与分支程序设计_第2页
汇编语言第5章 循环与分支程序设计_第3页
汇编语言第5章 循环与分支程序设计_第4页
汇编语言第5章 循环与分支程序设计_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、主要内容:系统功能调用简介1、MS-DOS设置了几十个内部子程序,可以完成 I/O设备管理,存储管理,文件管理,进程管理.它们被做成中断服务程序,其入口地址已由系统置入中断向量表中,可以用软中断指令调用.2、类型号:2027H3、系统功能调用:INT 21HDOS系统功能调用1.DOS系统功能调用格式1)在AH中设置功能号2)在指定的寄存器中设置入口参数3)用INT 21H指令执行系统功能调用4)根据出口参数分析执行情况2.DOS系统功能调用INT 21H的部分I/O操作1). 键盘输入一个字符并回显 计算机等待从标准输入设备(主要指键盘)输入,直到按下一个键。如果按下的是数字、字母等可用AS

2、CII码表示的字符,则这个字符就被送到屏幕显示,并把其对应的ASCII码值送到AL寄存器。如果按下Tab制表键,则光标通过添加空格。如按下的键是组合的Ctrl-Break两键,则执行23H的中断而退出命令执行。 功能号AH=01H,出口参数 AL=字符; 使用格式: MOV AH , 01H INT 21H Ex2.asm2). 键盘输入字符到缓冲区: 功能号 :AH=0AH, 入口参数 :DS:DX=缓冲区首址 (DS:DX)=缓冲区最大字符数 (DS:DX+1)=缓冲区实际输入字符数 (AL)=00有输入 (AL)=FF无输入 从键盘接收字符串存入内存。要求事先定义一个输入缓冲区,它的始址

3、放于DS:DX,第一个字节指出缓冲区能容纳的最大字符数(1255),不能为零,该值由用户设置;第二字节保留以用作由D0S返回实际读入的字符数(回车除外);从第三个字节开始存放从键盘上接收的字符。若实际输入的字符数少于定义的字节数,缓冲区内其余字节填零;若多于定义的字节数,则后来输入的字符丢掉并且响铃。DOS还自动在输入字符串的末尾加上回车字符,然而这个回车字符未被计入由DOS填到第二个辅助字节内的数目之中。因此,在设立输入缓冲区最大尺寸时要比所希望输入的字节数多一个字节。Ex3.asm 3).输出一个字符 功能号 : AH=2 入口参数 :DL=字符,光标随字符移动 使用格式: MOV DL

4、, A MOV AH , 02H INT 21H 执行上面程序后,将在屏幕上显示字符 A.Ex4.asm4).输出字符串, 功能号 : AH=9, 入口参数 :DS:DX=串地址,字串结束为“$”符号 使用格式: BUF DB HELLO!,$ MOV DX, OFFSET BUF MOV AH, 09H INT 21H . Ex5.asm4.5.4 DOS系统功能调用:I/O5)键盘输入一个字符无回显,支持CTRL_BREAK,CTRL_C检查处理。 功能号:AH=08H 出口参数:AL=字符;6)返回DOS系统 功能号:AH=4CH7)清键盘缓冲区,并调用一种键盘功能 功能号:AH=0CH

5、 AL=键盘功能号(1、7、8、0AH) 第5章 循环与分支程序设计编制一个汇编程序的步骤 :分析题意,确定算法。这一步是能否编制出高质量程序的关键,因此不应该一拿到题目就急于写程序,而是应该仔细地分析和理解题意,找出合理的算法及适当的数据结构。根据算法画出程序框图。这样可以减少出错的可能性。画框图时可以由粗到细把算法逐步地具体化。 根据框图编写程序。 上机调试程序。任何程序必须经过调试才能检查出你的设计思想是否正确以及你的程序是否符合你的设计思想,结果是否正确。5.1 顺序结构程序例1:自然数015的平方表,存在内存TABLE开始的连续16个单元中,现XAD单元存有任意一自然数(0X60Kg

6、不受理。程序:DATASEGMENT; 定义数据段XXDW 25; 设托运质量为25KgYYDW ?DATA ENDSSTACKSEGMENT ; 定义堆栈段DW 50h DUP(?)STACKENDSCODE SEGMENT; 定义代码段STARTPROC FARASSUME CS: CODE, DS: DATA, SS: STACKDEGIN:PUSHDSMOV AX, 0; DS:00压栈PUSH AXMOV AX, DATAMOV DS, AX; 置数据段MOV AX, XX; 取托运质量CMP AX, 0; AX与0比较是否大于JLE EXIT; 小于、等于转EXITCMP AX,

7、20;质量是否大于20KgJLE OK;小于、等于转OKCMP AX, 40;质量是否大于40KgJG LAB;大于转LABSUB AX, 20;G-20mov cx,2MUL cx;(G-20)*2ADD AX, 20;(G-20)*2+20JMP OK;转OKLAB: CMP AX, 60;质量是否大于60KgJG EXIT;大于60Kg 转EXITSUB AX, 40;(G-40)mov cx,3MUL cx;(G-40)*3ADD AX, 60;(G-40)*3+60OK:MOV YY, AX;托运费存入YY中EXIT:RETSTARTENDPCODE ENDSEND BEGIN3 根

8、据AL中的被放置位的情况控制转移到8个子程序(R1R8)中的一个:若 AL为00000001则转移至R1;若 AL为00000010则转移至R2;若 AL为00000100则转移至R3;若 AL为00001000则转移至R4;若 AL为00010000则转移至R5;若 AL为00100000则转移至R6;若 AL为01000000则转移至R7;若 AL为10000000则转移至R8。分析:实现CASE结构时,可以使用跳跃表法,使程序能根据不同的条件转移到多个程序分支中去。变址寻址方式、寄存器间接寻址方式、基址变址寻址方式实现跳跃表法的程序 。DATA SEGMENT; 定义数据段BRTABDW

9、 R11; 子程序R1入口偏移地址,段地址DW R21DW R31DW R41DW R51DW R61DW R71DW R81DATA ENDSSTACKSEGMENTPARA STACK STACK; 定义堆栈段DB100 DUP (?)TOPEQU$-STACKSTACKENDSCODE SEGMENT; 定义代码段STARTPROCFAR ASSUMECS:CODE, DS:DATA, SS:STACKDEGIN:PUSHDSMOVAX, 0; DS:00压栈PUSH AX; 使程序能返回DOSMOVAX, DATAMOVDS, AX; 置数据段MOVAX, STACMOVSS, AX;

10、 置堆栈段MOVAX, TOPMOVSP, AX; 置栈顶指针LEABX, BRTAB; BX指向跳转表GTBIT:RCRAL, 1JCGETAD; 顺序检查AL中各位的状态INCBX; BX加2,指向跳转表中INCBX; 下一个子程序地址JMPGTBITGETAD:JMPWORD PTR BX; 转移到相应的子程序STARTENDPCODEENDSENDBEGIN 基址变址寻址方式lea bx, BRTAB mov si,7*type branch_table mov cx,8 ; 循环次数8送cxl: shl al,1 ; 把al逻辑左移1位jnb not_yet ; CF=0转到not_

11、yet jmp word ptrbxsi ; CF=1转到相应程序分支not_yet: sub si,type branch_table; 修改地址 loopl ; 循环4、在附加段中,有一个按从小到大顺序排列的无符号数数组,其首地址存放在DI寄存器中,数组中的第一个单元存放着数组长度。在AX中有一个无符号数,要求在数组中查找(AX),如找到,则使CF = 0,并在SI中给出该元素在数组中的偏移地址;如未找到,则使CF = 1。折半查找算法:折半查找法先取有序数组的中间元素与查找值相比较,如相等则查找成功;如查找值大于中间元素,则再取高半部的中间元素与查找值相比较;如查找值小于中间元素,则再取

12、低半部的中间元素与查 找值相比较;如此重复直到查找成功或最终未找到该数(查找不成功)为止。折半查找法的效率高于顺序查找法,对于长度为N的表格,顺序查找法平均要作N/2次比较,而折半查找法的平均比较次数为 log2N。所以,如果数组长度为100,则顺序查找法平均要作50次比较,而折半查找法平均作7次比较就可以了。初始化被查找数组的首尾下标,low=1,high=n若lowhigh,则查找失败,置CF=1,退出程序。 否则,计算中点:mid=(low+high)/2 K与中点元素rmid比较。若k=rmid,则查找成功,程序结束;若krmid,则转步骤5低半部分查找(lower),high=mid

13、-1返回步骤2继续查找。高半部分查找(higher),low=mid+1返回步骤2继续查找。dsegsegmentlow_idxdw?high_idxdw?dsegendscsegsegmentb_searchprocnearassumecs:cseg,ds:dseg,es:dsegpushdspushaxmovax,dsegmovds,axmoves,axpopaxcmpax,es:di+2jachk_lastleasi,es:di+2jeexitstcjmpexitchk_last:movsi,es:dishlsi,1addsi,dicmpax,es:sijbsearchjeexitstc

14、jmpexitsearch:movlow_idx,1movbx,es:simovhigh_idx,bxmovbx,dimid:movcx,low_idxmovdx,high_idxcmpcx,dxjano_matchaddcx,dxshrcx,1movsi,cxshlsi,1compare:cmpax,es:bx+sijeexitjahigherdeccxmovhigh_idx,cxjmpmidhigher:inccxmovlow_idx,cxjmpmidno_match:stcexit:popdsretb_searchendpcsegendsend5.3 循环结构程序设计1、循环程序的结构形

15、式 DO_WHILE结构形式 。DO_WHILE结构把对循环控制条件的判断放在循环的入口,先判断条件,满足条件就执行循环体,否则则退出循环。 DO_UNTIL结构形式 。 先执行循环体然后再判断条件,不满足则继续,否则退出循环。 4.5.3 循环结构程序循环结构程序设计(2)循环程序的结构形式流程图: 循环结构程序设计(3)循环程序由三部分组成: 设置循环的初始状态 。 设置循环次数的计数值,以及循环体正常工作而建立的初始状态等。 (2) 循环体。 由循环的工作部分及修改部分组成,循环的工作部分是为完成程序功能而设计的主要程序段,循环的修改部分则是为保证每一次重复(循环)时,参加执行的信息能发

16、生有规律的变化而建立的程序段。(3) 循环控制部分。 每个循环程序必须选择一个循环控制条件来控制循环的运行和结束 。循环结构程序设计(4)例1 求S=1+2+3+100DATASEGMENT ; 定义数据段MAXDW 100SUMDW?DATAENDSSTACKSEGMENT PARA STACK; 定义堆栈段DW 20H DUP(?)STACKENDSCODESEGMENT; 定义代码段STARTPROCFARASSUME CS:CODE, DS:DATA, SS:STACKBEGIN:PUSHDS; DS压栈MOVAX, 0PUSHAX; 00压栈MOVAX, DATAMOVDS, AX;

17、 置数据段MOVAX,0; 累加器清0MOVCX,MAX; 循环控CX=MAXMOVBX,1; 初始加数用1AGAIN:ADDAX,BX ;累加求和 INCBX ; 下一个数 LOOPAGAIN ; 循环转AGAIN MOVSUM, AX; 求和结果存SUM中RET START ENDPCODE ENDSEND BEGIN循环结构程序设计(5)例2 求 N!DATASEGMENT; 定义数据段NDW 5YYDW ?DATAENDSSTACKSEGMENT ;定义堆栈段DW50H DUP (?)STACKENDSCODESEGMENT; 定义代码段STARTPROC FARASSUME CS:C

18、ODE, DS:DATA, SS:STACKBEGIN:PUSHDS ; DS压栈 MOVAX, 0 PUSHAX; 00压栈 MOVAX, DATA MOVDS, AX; 置数据段 MOVAX, N; AX=NCMPAX, 0; 比较是否为0 JNENOZ; 非0转NOZ INCAX; 0则AX=1 JMPEXIT; 转EXITNOZ:MOVBX, AX; BX=AX=NMOVAX, 1 ; 累积AX=1AGAIN:MULBX ; 相乘AX*BX-AXDECBX ; BX减1 JNEAGAIN ;非0继续EXIT:MOVYY, AX;保存N!结果到YY中 RET START ENDPCODE

19、ENDSENDBEGIN循环结构程序设计(6)例3:求2+4+6+直到和刚大于500,保存实际和及项数nDATASEGMENT; 定义数据段VARADW 500; minVARBDW ?VARCDW ?DATAENDSSTACKSEGMENT ; 定义堆栈段DW 20H DUP (?)STACKENDSCODESEGMENT; 定义代码段STARTPROCFAR ASSUME CS:CODE, DS:DATA, SS:STACKBEGIN:PUSH DS ; DS压栈MOV AX, 0 PUSH AX ; 0压栈 MOV AX, DATA MOV DS, AX MOV DX, VARA MOV

20、 AX, 0; 累加器清0 MOV BX, 2; 加数初值 MOV CX, 0; 项数记录CXAGAIN:ADD AX, BX ; 求和 INC CX; 项数记录CX加1INC BXINC BX; 加数加2 CMP AX, DX; 是否大于VARA JGE EXIT; 大于、等于转 JMP AGAIN; 否则,继续EXIT:MOV VARB, AX; 保存和MOV VARC, CX; 保存项数nRET STARTENDPCODE ENDSEND BEGIN循环结构程序设计(7)例4 试编制一个程序把BX寄存器内的二进制数用十六进制数的形 式在屏幕上显示出来。 循环结构程序设计(9)PROGNA

21、MSEGMENT ; 代码段定义MAIN PROC FAR ; 主程序 ASSUME CS: PROGNAMSTART:PUSH DSSUB AX, AX; DS:00压栈 PUSH AX MOV CH, 4; CH循环次数ROTATE: MOV CL, 4; 每次循环输出一位十六进制数 ROL BX, CL; 即移位4个二进制位MOV AL, BL; AL=BL ANDAL, 0FH; 取低4位 ADD AL, 30H; 转变为ASCII码 CMP AL, 3AH; 是否为0-9 JL PRINTIT ; 是转PRINTIT ADD AL, 7 H; 否转为A-FPRINTIT:MOV DL

22、, AL; DL=输出字符 MOV AH, 2 INT 21H; 调用DOS中断,显示字符 DEC CH JNZ ROTATE; 没循环结束,继续 RET; 返回MAIN ENDPPROGNAMENDS ENDSTART循环结构程序设计(10)例5:在ADDR单元中存放着数Y的地址,试编制一程序把Y中1的个数存入COUNT单元中。 程序框图 循环结构程序设计(11)DATAREA SEGMENT; 数据段定义ADDR DW NUMBERNUMBER DW YCOUNT DW ?DATAREA ENDSPROGNAM SEGMENT; 代码段定义MAIN PROC FAR ASSUME CS:P

23、ROGNAM, DS:DATAREA START: PUSHDS SUB AX, AX; DS:00压栈 PUSHAX MOVAX, DATAREA MOVDS, AX; 置数据段 MOVCX, 0; CX计数器清0 MOVBX, ADDR MOVAX, BX ; 取Y值给AXREPEAT:TESTAX, 0FFFFH JZEXIT; 测试AX是否为0?,是转EXIT JNSSHIFT; 符号为不为1转SHIFT INCCX ; 计数器加1SHIFT: SHLAX, 1; 左移一位 JMPREPEAT; 继续找1EXIT: MOVCOUNT, CX; 保存计数值 RETMAIN ENDPPRO

24、GNAM ENDS ENDS 例6: 学生成绩统计,要求键盘输入成绩、人数,并统计优、良、中、及格和不及格各多少人。循环结构程序设计(12)循环结构程序设计(13)DATASEGMENT; 定义数据段STUNUMEQU30; 学生人数SCOREDB68,75,37,93,65,80,78,70,84,67; 学生成绩 DB86,74,65,54,56,77,85,69,78,95DB 69,53,77,68,88,93,84,76,77,80LT60DB 0;存放不及格人数GE60DB0;存放及格人数GE70DB0;存放中人数GE80DB0;存放良人数GE90DB0;存放优人数DATASEGM

25、ENTSTACKSEGMENT;定义堆栈段STADW20H DUP(?)TOPDW?STACKENDSCODESEGMENT;定义代码段MAINPROCFARASSUMECS:CODE, DS:DATA, SS:STACKSTART:PUSHDS;DS压栈MOVAX,0PUSH AX;0压栈MOVAX,DATAMOVDS,AX;置数据段循环结构程序设计(14)MOVCX,STUNUM;取学生人数MOVBX,OFFSET SCORE;BX指向学生成绩表首地址B60:MOVAL,BX;取出一个学生成绩CMPAL,60;是否大于60JAM60;大于、等于转M60LEASI,LT60;SI指向LT60

26、单元INC SI;SI加1JMPNEXT;继续统计下一个成绩M60:CMPAL,70;是否大于70JAM70;大于、等于转M70LEASI,GE60;SI指向GE60单元INC SI ;SI加1JMPNEXT;继续统计下一个成绩M70:CMPAL,80;是否大于80JAM80;大于、等于转M80LEASI,GE70;SI指向GE70单元INC SI ;SI加1JMPNEXT;继续统计下一个成绩M80:CMPAL,90;是否大于90JAM90;大于、等于转M90LEASI,GE80;SI指向GE80单元INC SI ;SI加1JMPNEXT;继续统计下一个成绩M90:LEASI,GE90;SI指

27、向GE90单元INC SI ;SI加1NEXT:INCBX;BX加1LOOPB60;没有统计完,继续RETMAINENDPENDSTART循环结构程序设计(12)多重循环程序设计例1、延时程序 DELAY:MOVDX,3FFH; 外层循环3FFH次TIME:MOVAX,0FFFFH; 内层循环FFFFH次TIME1:DECAXNOP; 空操作,起延时作用JNETIME1; 内循环是否结束,否则继续DECDXJNETIME; 外循环是否结束,否则继续RET循环结构程序设计(13)例2:有一个首地址为A的N个数的数组,请编制程序使该数组中的数按照从大到小的次序整序。起泡排序算法举例总结:在做第一遍的(N-1)次比较后,最小的数已经放到了最后,所以第二遍比较只需

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论