第5章循环与分支程序设计.ppt

上传人:李司机 文档编号:4101801 上传时间:2023-04-04 格式:PPT 页数:45 大小:500.50KB
返回 下载 相关 举报
第5章循环与分支程序设计.ppt_第1页
第1页 / 共45页
第5章循环与分支程序设计.ppt_第2页
第2页 / 共45页
第5章循环与分支程序设计.ppt_第3页
第3页 / 共45页
第5章循环与分支程序设计.ppt_第4页
第4页 / 共45页
第5章循环与分支程序设计.ppt_第5页
第5页 / 共45页
点击查看更多>>
资源描述

《第5章循环与分支程序设计.ppt》由会员分享,可在线阅读,更多相关《第5章循环与分支程序设计.ppt(45页珍藏版)》请在三一办公上搜索。

1、第 5 章,循环与分支程序设计,本章要点,1掌握汇编语言程序设计的基本步骤和顺序程序设计的基本结构形式2学会如何分析问题,确定算法,画出程序流程图,分配工作单元和选择合适指令和编写程序的设计思想和方法3掌握简单的算术运算程序设计、直接查表法程序设计和简单的代码转换程序设计。,汇编语言程序的设计步骤,1、分析题意,确定算法2、根据算法画出程序框图 3、根据框图编写程序 4、上机调试程序,程序的结构,程序有:顺序、循环、分支和子程序四种结构形式,顺序结构:每条指令按其在程序中的排列顺序执行,51 循环程序设计,循环程序的结构形式:,循环程序组成,1)设置循环的初始状态 2)循环体。循环工作的主体,

2、由循环的工作部分及修改部分组成。3)循环控制部分 LOOP、LOOPZ、LOOPNZ在循环体中的使用,循环程序设计方法,例5l试编制一个程序把BX寄存器内的二进制数用十六进制数的形式在屏幕上显示出来,二进制到十六进制数转换的程序框图(略),编程方法-举例1,Data segment mess db Your Hex number is:$bb db 00110100b,00010010bData endsPrognam segment assume cs:prognam,ds:datastart:mov ax,data mov ds,ax lea dx,mess mov ah,9 int 21

3、h,mov bx,word ptr bb mov Ch,4;四个16进制数位,循环4次rotate:mov cl,4;rol bx,cl;右移四位 mov al,bl and al,0fh;取低4位 add al,30h;将16进制转为ASCII码 cmp al,3ah;比较,9?JL printit;是0到9的数码,打印 Add al,7h;是A 到F,转换,Printit:mov dl,al;ASCII码放DL mov ah,2;显示功能 int 21h;Call DOS dec ch jnz rotate;是4个数位吗?如还不是,继续 mov ah,4ch int 21h;return

4、to DOSprognam ends;end of segmentend start;end of assembly,用JNZ或JZ指令,编程方法-举例2,Data segment mess db Your Hex number is:$bb db 00110100b,00010010bData endsPrognam segment assume cs:prognam,ds:datastart:mov ax,data mov ds,ax lea dx,mess mov ah,9 int 21h,mov bx,word ptr bb mov CX,4;四个10进数位rotate:push cx

5、 mov cl,4;rol bx,cl;右移四位 mov al,bl and al,0fh;取低4位 add al,30h;将16进制转为ASCII码 cmp al,3ah;比较,9?JL printit;是0到9的数码,打印 Add al,7h;是A 到F,转换,用LOOP指令,Printit:mov dl,al;ASCII码放DL mov ah,2;显示功能 int 21h;Call DOS pop cx loop rotate;是4个数位吗?如还不是,继续 mov ah,4ch int 21h;return to DOSprognam ends;end of segmentend sta

6、rt;end of assembly,编程方法-举例3,Prognam segmentmain proc far assume cs:prognamstart:push ds;保存data段地址,设置返回栈 sub ax,ax Push ax push bx;修改部分 mov bx,1234h;修改部分,子程序格式,;main part of program mov Ch,4;四个10进数位rotate:mov cl,4;rol bx,cl;右移四位 mov al,bl and al,0fh;取低4位 add al,30h;将16进制转为ASCII码 cmp al,3ah;比较,9?JL pr

7、intit;是0到9的数码,打印 Add al,7h;是A 到F,转换,Printit:mov dl,al;ASCII码放DL mov ah,2;显示功能 int 21h;Call DOS dec ch jnz rotate;是4个数位吗?如还不是,继续 pop bx;修改部分 ret;return to DOSmain endp;end of main part prognam ends;end of segmentend;end of assembly,例5.2,在ADDR单元中存放着数Y的地址,试编制一程序把Y中1的个数存入COUNT单元中。,两个问题:数据段如何定义,需定义哪些变量?需

8、不需要附加段?,Y DW 1234HADDR DW YCOUNT DB?,算法分析与程序框架,逐位测试采用DO-WHILE的结构,子程序形式的程序:m502CNT1.asm,程序,datarea segment addr dw Y Y dw 1234h;修改 count dw?datarea endsPrognam segment assume cs:prognam,ds:datareastart:mov ax,datarea mov ds,ax mov cx,0 mov bx,addr mov ax,bx;将Y中数据=AX,repeat:test ax,0ffffh jz exit jns

9、Shift inc cx Shift:shl ax,1 Jmp repeat exit:mov count,cx mov ax,4c00h int 21hPrognam ends End start,以十进制怎样显示COUNT中数据?,如Y为双字长数据,本程序应怎样修改?,例53,在附加段中有一个首地址为LIST和未经排序的字数组,在数组的第一个字中存放着该数组的长度,数组的首地址已存放在DI寄存器中。AX寄存器中存放着一个数。要求编制一程序:在数组中查找该数,如果找到此数则把它从数组中删除。,分 析,查找元素可使用串处理指令:删除元素可使用循环结构:处理方法:如果找到这一元素则把数组中地址比

10、该元素高的元素 向低地址方向移动二个字,并修改数组长度值如果找到的元素正好位于数组末尾,则不必移动任何元素,只要修改数组长度值就可以,程序:m503DelE.asm(子程序格式),编程方法-举例1,datarea segment;define data segment 修改-LIST dw 10,65,67,69,71,66,73,71,77,68,72datarea endsprognam segment assume cs:prognam,es:datarea start:mov ax,datarea mov es,ax mov ax,71;如要查数据 71 cld Push di;保存原

11、先DI中数据 mov di,offset list;取LIST地址 Push di;保存开始地址DI,续,mov cx,es:di;取长度 add di,2 Repne scasw je delete Pop di jmp short exitdelete:jcxz dec_cnt Next_el:;移动 mov bx,es:di mov es:di-2,bx add di,2 loop next_el,dec_cnt:pop di dec word PTR es:diexit:POP DI MOV AX,4C00H INT 21HPrognam ends End start,例 54,将正数

12、N插入一个已排序的字数组的正确位置。该数组的首地址和末地址分别为ARRAY_HEAD和ARRAY_END,其中所有数均为正数且已按递增的次序排列。,分 析,找到应插入数的位置作为循环的结束条件空出插入数的位置高地址元素,向高地址方向移一个字从数组的尾部向头部查找,数据段定义,datarea segment x dw?array_head dw 3,5,15,23,37,49,52,65,78,99 array_end dw 105 n dw 32datarea ends,程序:m504Sort.asm,例 55,设有数组X和Y。X数组中有X1,X10;Y数组中有Y1,Y10。试编制程序计算:Z

13、1X1+Y1 Z5X5-Y5 Z8X8-Y8 Z2X2+Y2 Z6X6+Y6 Z9X9+Y9 Z3X3-Y3 Z7X7-Y7 Z10X10+Y10 Z4X4-Y4结果存入Z数组。,分 析,用循环程序结构,循环计数值为10每次操作:加法或减法每次应该做哪一种操作,由逻辑尺确定:0000 0000 1101 1100最高的6位没有意义,程序框图,程序:chap5m505Calc.asm,例 5.6,试编制一程序:从键盘输入一行字符,要求第一个键入的字符必须是空格符,如不是则退出程序;如是则开始接收键入的字符并顺序存放在首地址为BUFFER的缓冲区中(空格符不存入),直到接收到第二个空格符时退出程序

14、。,程序框图,程序例5.6,Flag=1记第一个空字符,5.1.3 多重循环程序设计,多重循环程序设计的基本方法和单重循环程序设计一致注意控制条件和循环次数:1、应分别考虑各重循环的控制条件及其程序实现,相互之间不能混淆;2、应注意在每次通过外层循环再次进入内层循环时,初始条件必须重新设置3、在多次使用CX时,要注意循环次数的保存,例57,有一个首地址为A的N字数组,请编制程序使该数组中的数按照从大到小的次序整序。,采用起泡排序算法方法:从第一个数开始依次对相邻两个数进行比较。如次序对,则不做任何操作;如次序不对,则将这两个数交换位置。,数据段,datarea segment n equ 12

15、;此处修改 a dw n dup(?)datarea ends程序:例5.7,例58,在附加段中有一个字数组,其首地址已存放在DI寄存器中,在数组的第一个字中存放着该数组的长度。要求编制一个程序使该数组中的数按照从小到大的次序排列整齐。,数据段、代码段,data segment save_cnt dw?Start_addr dw?data endsextra segment;修改 len dw 9,14,32,12,87,54,23,42,53,76extra ends;修改,prognam segmentbubble Proc far assume cs:prognam,ds:data,ES

16、:extra;此处修改start:push ds;修改 sub ax,ax push ax;修改 mov ax,data mov ds,ax mov ax,extra;此处修改 mov es,ax;此处修改,mov di,offset len;此处修改 mov start_addr,di;首地址存放在内存中 mov cx,es:di;根据首地址取元素个数N mov save_cnt,cx;个数N保存在内存init:mov bx,1;初始化设置;设BX=1(即假设未作过交换数据)dec save_cnt;做 count-l 次比较 jz sorted;如save_cnt=O,退出 mov cx,

17、save_cnt;否则 比较次数放cx mov di,start_addr;将开始地址放 DI,next:add di,2 mov ax,es:di;取第一个元素放 AX cmp es:di+2,ax;下一个元素 当前元素AX?jae cont;如不,取下一个元素比较 xchg es:di+2,ax;如是,则交换,即小者前移 mov es:di,ax sub bx,bx;设置作过交换过数据标志,即设 BX=0cont:loop next cmp bx,0;这一轮作过数据交换吗?je init;作过,再次处理,sorted:mov di,start_addr;没有进行过数据交换,说明数据已排好序

18、 ret;exitbubble endpprognam ends;end of code Segmentend start;end assembly 修改,完整程序:例5.8,52分支程序设计,分支程序的结构形式,IF-THEN-ELSE结构,CASE结构,例59,在附加段中,有一个按从小到大顺序排列的无符号数的数组,其首地址存放在DI寄存器中,数组中的第一个单元存放着数组长度。在AX中有一个无符号数,要求在数组中查找(AX),如找到则使CF=0,并在SI中给出该元素在数组中的偏移地址,如未找到则使CF1。,采用折半查找法,折半查找算法的程序框图,程序:例5.9,5.2.3 跳跃表法,例5.10:试根据AL寄存器中哪一位为1(从低位到高位)把程序转移到8个不同的程序分支去。用寄存器间接寻址方式实现跳跃表法 用变址寻址方式实现跳跃表法用基址变址寻址方式实现跳跃表法,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号