《80*86汇编语言程序设计 第2版 教学课件 ppt 作者 马力妮第5章 顺序、分支和循环程序设计》由会员分享,可在线阅读,更多相关《80*86汇编语言程序设计 第2版 教学课件 ppt 作者 马力妮第5章 顺序、分支和循环程序设计(105页珍藏版)》请在金锄头文库上搜索。
1、第5章 顺序、分支和循环程序设计,5.1顺序程序设计 5.2分支程序设计 5.3 循环程序设计 共6学时,编写程序的一般步骤,分析问题 算法设计,画出流程图 根据流程图编写源程序 程序的调试与修改,5.1 顺序程序设计,顺序程序设计在设计这种程序中,没有分支和循环,只要遵照算法按步骤顺序写出相应的指令即可。用流程图来描述如图5-1所示。,图5-1,【例5-1】设X、Y 、Z为有符号字变量,编写程序计算表达式 (X+Y)*5+8-X)Z的值,结果存放到双字变量RESULT中。 (1)程序的基本结构:,(2)计算表达式的值 算法分析: 步骤1:计算X+Y; 步骤2:计算(X+Y)*5; 步骤3:计
2、算(X+Y)*5+8 步骤4:计算 (X+Y)*5+8-X 步骤5:计算(X+Y)*5+8-X)Z 程序算法流程图如图5-3所示。,(3) 根据流程图编写汇编程序: DATA SEGMENT ;数据段, 定义X、Y、Z为字变量 X DW ? Y DW ? Z DW ? RESULT DD ? ;RESULT为双字变量 DATA ENDS CODE SEGMENT CODE ;代码段 ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX ;数据段段地址送DS中 MOV AX,X ADD AX,Y ; 计算X+YAX MOV BX,5 IMUL B
3、X ;计算(X+Y)*5, AX*5DX:AX ADD AX,8 ADC DX,0 ;计算(X+Y)*5+8,(DX:AX)+8DX:AX SUB AX,X SBB DX,0 ;计算 (X+Y)*5+8-X,(DX:AX)-XDX:AX IDIV Z ;计算(X+Y)*5+8-X)Z 商AX,余数DX MOV WORD PTR RESULT,AX ;商RESULT MOV WORD PTR RESULT+2,DX ;余数RESULT+2 MOV AX,4C00H ;程序结束返回DOS INT 21H CODE ENDS ;代码段结束 END START,(4) 程序说明: 1) 变量X、Y 、
4、Z为有符号字变量,在数据段中定义。加减法指令不分有符号或无符号,乘除法指令用有符号乘除法指令IMUL和IDIV。 2)由于把5送到BX中,在IMUL BX指令之前要把乘数AX符号扩展到DX中,才可以做 (DX:AX)*BXDX:AX。 3)RESULT是双字变量,当商AX送RESULT低字,DX余数送RESULT高字时,要说明RESULT的字属性。 4)该程序在调试过程中,应把X、Y、Z的值写在程序的数据段中,执行结果是在RESULT中,可以通过DEBUG或CodeView看到。,【例5-3】 通过键盘键入一个两位十进制数,将该数转换成压缩的BCD码,送BUF中。 (1)分析: 1)获取键盘键
5、入的数据是利用下面两条指令来完成: MOV AH,01H ;1号功能,通过键盘读入1个ASCII码AL INT 21H ;中断21H 2)通过键盘键入的数字的ASCII码为:,将ASCII码转换成BCD码,用去掉30H的方法: SUB AL,30H (2)程序流程图如图5-5所示。,(3)根据流程图编写汇编程序: DATA SEGMENT ;定义数据段 BUF DB ? ;BUF为字节变量 DATA ENDS CODE SEGMENT CODE ;定义代码段 ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX ;数据段段地址送DS中 MOV
6、AH,01H ;通过键盘读入十位ASCII码AL INT 21H SUB AL,30H ;将十位ASCII码转换成BCD码AL SHL AL,4 ;将十位BCD码左移4位AL MOV BUF,AL ;将ALBUF保存 MOV AH,01H ;通过键盘读入个位ASCII码AL INT 21H SUB AL,30H ;将个位ASCII码转换成BCD码AL OR BUF,AL ;将十位BCD码和个位BCD码合并BUF MOV AX,4C00H ;程序结束返回DOS INT 21H CODE ENDS ;代码段结束 END START,(4)程序说明: 1)用中断21H的1号功能,每次只能读入1个AS
7、CII码送AL,在程序中分别两次从端口获取数据。 2) 将ASCII码转换成BCD码后,将十位BCD码和个位BCD码合并送BUF中。 3)该程序的执行结果在数据段的字节变量BUF中,可以通过DEBUG或CodeView看到。,5.2分支程序设计,5.2.1 转移指令 5.2.2 条件转移指令 5.2.3 根据条件设置字节指令 5.2.4 分支程序设计的应用举例,分支结构就是在顺序结构的基础上加判断框形成程序的分支结构。,在汇编指令中共有4组程序转移指令: 无条件转移指令(在第3章介绍) 条件转移指令 循环指令 中断指令(在第8章介绍),5.2.1转移指令,5.2.2 条件转移指令,条件转移指令
8、分为3大类: 根据单个标志的条件转移指令 根据无符号数比较的结果产生的条件转移指令(无符号数条件转移指令) 根据带符号数比较结果产生的条件转移指令(带符号数条件转移指令) JCXZ指令是根据CX寄存器的内容而产生的条件转移指令 条件转移指令的格式: 所有条件转移只能是段内直接短转移,而且与JMP指令一样不影响任何标志位。,条件转移指令助记符 短标号,1比较指令CMP 比较指令的格式: 比较指令的功能: DSTSRC 结果反映在标志上而不送回到目的操作数DST。 对标志寄存器的影响:OF、SF、ZF、AF、PF、CF有影响。 需要注意的问题: 该指令的操作数只能是寄存器操作数和存储器操作数,两个
9、操作数不能同时为存储器操作数。 表5-1表中说明2个操作数的比较结果。,CMP DST , SRC,【例5-4】设AX=5,BX=8,比较两数的大小。 执行CMP AX,BX后,标志寄存器中:CF=1,SF=1,OF=0,ZF=0。 当把AX和BX中的数看做是无符号数时,CF=1则AXBX。 当把AX和BX中的数看做是有符号数时,OF=0,SF=1则AXBX。 设AX=5,BX=-8 执行CMP AX,BX后,标志寄存器中:CF=1,SF=0 ,0F=0,ZF=0。 当AX和BX中的数是有符号数:OF=0,SF=0则AXBX。 当认为AX和BX中的数是无符号数时:AX=0005H,BX=0FF
10、F8H,CF=1则AXBX。,2根据单个标志的条件转移指令 根据单个标志的条件转移指令是仅取决于标志寄存器中某一个标志位的状态而形成的条件转移指令。 标志寄存器的标志位包括:ZF、CF、SF、OF及PF。,假如:比较两数X和Y是否相等,相等执行程序段L1,不等执行程序段L2。 则: MOV AX,Y CMP AX,X ;Y-X结果不送目的操作数 JZ L1 ;相等时ZF=1转到L1 ;L2程序段,不等时ZF=0执行L2程序段 L1 : ;L1程序段 或: MOV AX,Y CMP AX,X ;Y-X结果不送目的操作数 JNZ L2 ;不等时ZF=0转到L2 ;L1程序段,相等时ZF=1执行L1
11、程序段 L2: ;L2程序段 ,3无符号数条件转移指令 当需要由两个无符号数的大小来决定程序是否转移时,其判断条件是根据标志寄存器的CF和状态的组合而产生。 假设有两个无符号数A、B,在使用条件转移指令之前一般用CMP比较指令将两数相减,结果不送,只影响标志CF和ZF,当CF=0 同时 ZF=0时,则AB 。 对无符号数条件转移指令的比较一般用高于(Above)、低于(Below)和等于(Equal)来表示的, 无符号数的条件转移指令如表5-3所示。 表5-3 无符号数的条件转移指令,其中:A、B为无符号数,【例5-5】设AX和BX中存放的是无符号数,计算AX-BX结果送数据段RESULT字变
12、量中。 (1)分析: 1)在数据段中定义字变量RESULT。 2)在程序中将用MOV指令将AX和BX赋值。 3)AXBX时作AX-BX,当AX BX时作BX-AX 4)AX和BX中存放的是无符号数采用无符号数条件转移指令JAE或JNB。 (2)程序流程图如图5-7所示。,图5-7例5-5流程图,(3)根据流程图编写汇编程序: DATA SEGMENT ;定义数据段 RESULT DW ? DATA ENDS CODE SEGMEND ;定义代码段 ASSUME CS:CODE,DS:DATA,SS:STACK START:MOV AX,DATA MOV DS,AX ;数据段段地址送DS中 MO
13、V AX, 1 MOV BX, 6 CMP AX,BX ;比较 JAE LOP ;AXBX时转移 XCHG AX,BX ;如果AXBX,交换AX、BX LOP: SUB AX,BX MOV RESULT,AX MOV AX,4C00H ;程序结束返回DOS INT 21H CODE ENDS ;代码段结束 END START,(4)程序说明: 1)比较两数的大小,大数减小数,因此,当AXBX时用交换指令将AX和BX的内容交换使大数放在AX中,结果也在AX中,最后将AX的内容送RESULT中。 2)该程序的执行结果在数据段的RESULT字变量中。,4带符号数条件转移指令 根据两个有符号数的大小来
14、决定程序是否转移时,则必须选用有符号数条件转移指令。其判断条件是根据CF、 OF和状态的组合而产生的。 假设有2个无符号数A、B,在使用条件转移指令之前一般用CMP比较指令将两数相减,结果不送,只影响标志SF、OF和ZF。 当SF=OF 同时 ZF=0时,则AB 。 带符号数条件转移指令的比较一般用大于(Greater)、小于(Less)和等于(Equal)表示,以表示与无符号数条件转移指令的区别。,表5-4 带符号数的条件转移指令,其中:A、B为两个有符号数,【例5-6】编写程序,计算下列公式: 1 X0 Y= 0 X=0 -1 X0,3个分支,用2个条件指令。 4) X存放的是带符号数,因
15、此,采用带符号数条件转移指令JGE或JNL。当判断X是否等于0时用 JZ或JE转移指令。 (2)程序算法流程图如图5-8所示。,图5-8,(3)根据流程图编写汇编程序: DATA SEGMENT ;定义数据段 X DW ? Y DW ? DATA ENDS CODE SEGMEND ;定义代码段 ASSUME CS:CODE,DS:DATA,SS:STACK START:MOV AX,DATA MOV DS,AX ;数据段段地址送DS中 MOV X,-2 ;为X赋初值 CMP X,0 ;比较X0? JGE BIN ;X0时转移BIN MOV Y,-1 ;如果X0,则Y=-1 JMP NEXT BIN: JZ EQUL ;X=0,则转EQUL MOV Y,1 ;X0,Y=1 JMP NEXT EQUL: MOV Y,0 ;X=