选择与循环结构.ppt

上传人:小飞机 文档编号:5320540 上传时间:2023-06-25 格式:PPT 页数:23 大小:327.83KB
返回 下载 相关 举报
选择与循环结构.ppt_第1页
第1页 / 共23页
选择与循环结构.ppt_第2页
第2页 / 共23页
选择与循环结构.ppt_第3页
第3页 / 共23页
选择与循环结构.ppt_第4页
第4页 / 共23页
选择与循环结构.ppt_第5页
第5页 / 共23页
点击查看更多>>
资源描述

《选择与循环结构.ppt》由会员分享,可在线阅读,更多相关《选择与循环结构.ppt(23页珍藏版)》请在三一办公上搜索。

1、第四章 汇编语言的程序设计,4.6.2基本程序结构的设计顺序结构,分支结构,循环结构是用汇编语言进行程序设计的基本程序结构。下面主要学习形成这些结构的程序控制方法和指令用法。,例在显示器上显示“HOW DO YOU DO!”.MODEL SMALL;小模式.DATA;数据段STRING DB HOW DO YOU DO!$.STACK 200;堆栈段,预留200字节.CODE;代码段START:MOV AX,DATA;取数据段地址 MOV DS,AX MOV DX,OFFSET STRING;取字符串首地址 MOV AH,9;9号DOS功能调用,输出字符串 INT 21H MOV AH,4CH

2、;返回DOS INT 21H END START;汇编结束,简化段的定义,汇编语言程序调试过程,编辑建立汇编语言源程序 源文件.ASM汇编 目标文件.OBJ 列表文件.LST 交叉引用文件.CRF链接 可执行文件.EXE 连接映象文件.MAP 调试 最终程序,EDIT,MASM,LINK,DEBUG,试运行、验证、诊断、修改,写字板、记事本,标号:,条件满足?,处理,N,Y,IFTHEN结构,程序结构:一个入口,一个出口 测试/比较指令(TEST/CMP)条件转移指令(Jx 标号)处理体 标号:其他指令,4.6.2 分支结构程序的设计 P.135,程序结构:TEST/CMP指令 Jx 标号1

3、处理体P1 JMP 标号2标号1:处理体P2 标号2:其他指令,条件满足?,处理P1,处理P2,标号1:,标号2:,N,Y,IFTHENELSE结构,标号1:,条件1 成立?,P1,N,Y,CASE结构,程序结构:TEST/CMP指令(测试条件1)Jx 标号1;不满足转标号1 处理体P1 JMP 标号n+1标号1:TEST/CMP指令(测试条件2)Jx 标号2;不满足转标号2 处理体P2 JMP 标号n+1标号2:TEST/CMP指令(测试条件3)Jx 标号3;不满足转标号3 处理体P3 JMP 标号n+1标号3:TEST/CMP指令(测试条件4)标号n+1:(公共出口),条件2 成立?,条件

4、n 成立?,Pn+1,标号2:,标号n:,标号n+1:,P2,Pn,N,N,Y,Y,4.6.2 1.二路分支结构程序设计 P.135,例 从键盘输入一位数字,判断其奇偶性,并在屏幕输出一个标志,若为奇数,则输出1,否则输出0。画出流程图。,偶数?,AL-30H,AL-31H,Y,N,输出AL,一个入口,一个出口,NAME P124 TITLE 判断从键盘输入一位数字的奇偶性,并在屏幕输出1(奇数)或0(偶数)标志。CODE SEGMENT;代码段 ASSUME CS:CODEBEGIN:MOV AH,01H;1号DOS中断调用INT 21H;键入一位数字送AL且显示TEST AL,01H;测试

5、最低位JZ EVN;偶数,转MOV AL,31H;奇数,置“1”JMP DISPEVN:MOV AL,30H;偶数,置“0”DISP:PUSH AXMOV AH,2;2号DOS中断调用MOV DL,0AH;输出换行INT 21HMOV DL,0DH;输出回车INT 21HPOP AXMOV AH,2;2号DOS中断调用MOV DL,AL;输出奇数/偶数标志INT 21HMOV AH,4CH;返回DOSINT 21HCODE ENDS END BEGIN;汇编到此结束,NAME P124 TITLE 判断从键盘输入一位数字的奇偶性,并在屏幕输出1(奇数)或0(偶数)标志。CODE SEGMENT

6、;代码段 ASSUME CS:CODEBEGIN:MOV AH,01H;1号DOS中断调用INT 21H;键入一位数字送AL且显示TEST AL,01H;测试最低位JZ EVN;偶数,转MOV AL,31H;奇数,置“1”JMP DISPEVN:MOV AL,30H;偶数,置“0”DISP:PUSH AXMOV AH,2;2号DOS中断调用MOV DL,0AH;输出换行INT 21HMOV DL,0DH;输出回车INT 21HPOP AXMOV AH,2;2号DOS中断调用MOV DL,AL;输出奇数/偶数标志INT 21HMOV AH,4CH;返回DOSINT 21HCODE ENDS EN

7、D BEGIN;汇编到此结束,CODE SEGMENT;代码段 ASSUME CS:CODEBEGIN:MOV AH,01H;1号DOS系统调用INT 21H;键入一位数字送AL且显示TEST AL,01H;测试最低位JZ EVN;偶数,转MOV AL,31H;奇数,置“1”标志JMP DISPEVN:MOV AL,30H;偶数,置“0”标志DISP:MOV AH,2;2号DOS系统调用PUSH AX;保存AX中标志内容(因为2号INT 21H会将DLAL)MOV DL,0AH;输出换行INT 21HMOV DL,0DH;输出回车INT 21HPOP AX;弹出AX中标志内容MOV AH,2;

8、2号DOS系统调用MOV DL,AL;输出奇数/偶数标志INT 21HMOV AH,4CH;返回DOSINT 21HCODE ENDS END BEGIN;汇编到此结束,一个入口,一个出口,4.6.2 2.多路分支结构程序设计,例 任意给定x值(-128x+127),求以下符号函数y的值。1,当x0 y=0,当x=0-1,当x0画出程序流程图,见教材P136图4.6。,NAME P124 TITLE 判断从键盘输入一位数字的奇偶性,并在屏幕输出1(奇数)或0(偶数)标志。CODE SEGMENT;代码段 ASSUME CS:CODEBEGIN:MOV AH,01H;1号DOS中断调用INT 2

9、1H;键入一位数字送AL且显示TEST AL,01H;测试最低位JZ EVN;偶数,转MOV AL,31H;奇数,置“1”JMP DISPEVN:MOV AL,30H;偶数,置“0”DISP:PUSH AXMOV AH,2;2号DOS中断调用MOV DL,0AH;输出换行INT 21HMOV DL,0DH;输出回车INT 21HPOP AXMOV AH,2;2号DOS中断调用MOV DL,AL;输出奇数/偶数标志INT 21HMOV AH,4CH;返回DOSINT 21HCODE ENDS END BEGIN;汇编到此结束,NAME P124 TITLE 判断从键盘输入一位数字的奇偶性,并在屏

10、幕输出1(奇数)或0(偶数)标志。CODE SEGMENT;代码段 ASSUME CS:CODEBEGIN:MOV AH,01H;1号DOS中断调用INT 21H;键入一位数字送AL且显示TEST AL,01H;测试最低位JZ EVN;偶数,转MOV AL,31H;奇数,置“1”JMP DISPEVN:MOV AL,30H;偶数,置“0”DISP:PUSH AXMOV AH,2;2号DOS中断调用MOV DL,0AH;输出换行INT 21HMOV DL,0DH;输出回车INT 21HPOP AXMOV AH,2;2号DOS中断调用MOV DL,AL;输出奇数/偶数标志INT 21HMOV AH

11、,4CH;返回DOSINT 21HCODE ENDS END BEGIN;汇编到此结束,;P.136求x的符号函数的完整程序.MODEL SMALL;小模式.DATA;数据段 x DB-18 y DB?.CODE;代码段START:MOV AX,DATA;取数据段 MOV DS,AX MOV AL,x;取x CMP AL,0;作x-0比较 JGE GE1;x0则转MOV AL,-1JMP EX;否则x0则赋-1GE1:JE ZERO;x0前提下x=0则转(同JZ)MOV AL,1;x0前提下x0则x0赋+1JMP EX;转存结果ZERO:MOV AL,0;x=0则赋0EX:MOV y,AL;存

12、结果MOV AH,4CH;返回DOSINT 21H END START;汇编结束,一个入口,一个出口,是否需要加JMP EX?,分支程序作业:1、编写程序,将DISP单元中存放的单字节内容以十六进制字符形式输出显示。2、求X、Y两个双字节无符号数的差的绝对值存入Z单元。编写上述两程序并调试,对结果进行讨论。,4.6.3 循环结构程序的设计 P.137,(a)DO WHILE 结构(当型循环结构,较少用)先判断条件,再执行 循环体部分有可能一次都不执行。,循环结果处理,循环体,循环初始化,循环结束条件?,N,Y,地址指针初值数据初值 循环次数或条件设定,状态判别处理结果存放,循环公共操作,(b)

13、DOUNTIL 结构(直到型循环结构,较常用)先执行,再判断条件循环体部分至少执行一次,循环结果处理,循环体,循环初始化,继续循环条件?,N,Y,地址指针初值数据初值 循环次数或条件设定,状态判别处理结果存放,循环公共操作,循环可以嵌套(多重循环),但各循环结构之间不能交叉,DATA SEGMENT;数据段BUF DB 12H,31H,0A5H;定义三个原始数据SUM DB?;定义存放累加和的字节单元,无初值DATA ENDSCODE SEGMENT;代码段 ASSUME CS:CODE,DS:DATA;段说明START:MOV AX,DATA;数据段寄存器赋值 MOV DS,AX MOV A

14、L,0;累加器清0 MOV SI,OFFSET BUF;取BUF偏移地址指向第一个数 LP:ADD AL,SI;加第一个数(寄存器间接寻址)INC SI;SI指向第二个数 ADD AL,SI;加上第二个数(寄存器间接寻址)ADD AL,SI+1;加上第三个数(寄存器相对寻址)MOV SUM,AL;存和值到SUM单元(设和值仍为单字节)MOV AH,4CH;返回DOS INT 21HCODE ENDS END START;汇编到此结束,从START起执行,补充例1将BUF单元开始的三个单元内容相加存放到SUM单元中。,DATA SEGMENT;数据段BUF DB 12H,31H,0A5H;定义三

15、个原始数据SUM DB?;定义存放累加和的字节单元,无初值DATA ENDSCODE SEGMENT;代码段 ASSUME CS:CODE,DS:DATA;段说明START:MOV AX,DATA;数据段寄存器赋值 MOV DS,AX MOV AL,0;累加器清0 MOV SI,OFFSET BUF;取BUF偏移地址指向第一个数 MOV CX,03H;设置循环3次 LP:ADD AL,SI;加第一个数(寄存器间接寻址)INC SI;SI指向第二个数下一个数 ADD AL,SI;加上第二个数(寄存器间接寻址)ADD AL,SI+1;加上第三个数(寄存器相对寻址)LOOP LP;未加完,继续循环

16、MOV SUM,AL;存和值到SUM单元(设和值仍为单字节)MOV AH,4CH;返回DOS INT 21HCODE ENDS END START;汇编到此结束,从START起执行,补充例1将BUF单元开始的三个单元内容相加存放到SUM单元中。,1.单重循环例(1),例 从X单元开始的30个连续单元中存放有30个单字节无符号数,从中找出最大者送入Y单元。(见下一页面)循环次数已知,其流程图如何?入口和出口有什么特点?类似的问题:例 10个带符号的字,找出最大的一个字。例 10个带符号的字,从中找出最小的一个字。,.MODEL SMALL;小模式.STACK 200H;预留512个单元的堆栈空间

17、.DATA;数据段 x DB 11,22,.y DB?.CODE;代码段 ST:MOV AX,DATA;设数据段MOV DS,AXMOV AL,X;取首元素 循环初始化MOV BX,OFFSET X;取首元素地址MOV CX,29;置循环29次 L1:INC BX;BX指向新一元素(指针调整)循环体CMP AL,BX;与新的一个数比较JAE L2;若(AL)BX,AL维持原值,转L2MOV AL,BX;新的这个元素大则送入AL L2:DEC CX;CX循环计数减1 循环控制 JNZ L1;未完,转回L1继续循环 MOV Y,AX;存最大数结果到Y单元 结果处理MOV AH,4CH;返回DOS

18、INT 21H END ST;汇编结束,LOOP L1,例 从自然数1开始累加,直到累加和不超过500为止,统计被累加的自然数的个数,并把统计的个数送入N中,把累加和送入SUM单元。循环次数事先未知,流程图形式如何?程序见下一页面。,1.单重循环例(2),.MODEL SMALL;小模式.STACK 200;预留200个单元的堆栈空间.DATA;数据段 N DW?;SUM DW?;.CODE;代码段START:MOV AX,DATA;数据段寄存器赋值1141HMOV DS,AXMOV AX,0;累加和单元清0 初始化MOV BX,0;自然数单元置0 L:INC BX;BX加1得新一个自然数 循

19、环体ADD AX,BX;加入新一个自然数CMP AX,500;累加和与500比较,有符号数还是无符号数?JBE L;(AX)500,转L继续循环 循环控制 SUB AX,BXDEC BXMOV N,BX;存最终自然数,即个数 结果处理MOV SUM,AX;存累加和MOV AH,4CH;返回DOS INT 21H END START;汇编结束,补充例1 软件延时程序段:.MOV BX,100 L1:NOP MOV CX,50L2:NOPNOPNOPLOOP L2NOPDEC BXJNZ L1.,2.多重循环例,P157例4.20 将一个16位二进制数BIN转换为十进制数DECIM并以非组合BCD

20、码形式存放。分析16位无符号二进制整数最大为65535,可能有5位BCD码。每次将该整数除以10,第一次得到的余数即为个位,商再除以10,第二次得到的商为十位,依次类推,最后可得到全部5位。无符号数除法指令DIV,当除数为16位数时,得到的余数在DX中,商在AX中,这样不用很麻烦做5次除法,即可求出DECIM的各位。,3.数码转换例,.model small.databin dw 5634hdecim db 5 dup(0).code mov ax,data;取出数据段址 mov ds,ax mov cx,5;循环5次,依次得到5位非组合BCD码 mov bx,10;作16位除数用 lea di,decim+4;di首先指向最低位BCD码 mov ax,bin;取被除数送AXagain:xor dx,dx;除数高16位清零 div bx;MOV DI,DL;存余数(教材第157页遗漏!)dec di;SI改指向下一门第一个学生成绩 loop again;DI改指向下一门平均成绩单元 mov ah,4ch;返回操作系统 int 21h end,(1)阅读P166之2、3题,P170之10.(2)完成P176之11题。,

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

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


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号