第五章循环及分支程序设计

合集下载

汇编语言程序设计 第05章:循环与分支程序设计

汇编语言程序设计 第05章:循环与分支程序设计

5
5.0 顺序程序设计
顺序程序完全按指令书写的前后顺序执 行每一条指令,是最基本、最常见的程 序结构 一般纯粹的顺序结构的程序设计较少。 。
6
5.0 顺序程序设计
例:W X+Y+Z
data segment X dw 5 Y dw 6 Z dw 7 W dw ? data ends code segment main proc far assume cs:code,ds:data start: push ds xor ax,ax push ax mov ax,data mov ds,ax mov ax,X add ax,Y add ax,Z mov W,ax ret main endp code ends end start
18
5.1 循环程序设计 5.1.1 循环程序的设计方法
例:将正数 n 插入一个已整序的正数字 数组。该数组的首地址和末地址分别为 ARRAY_HEAD, ARRAY_END 分析:题目要求在已经排好序的正数数 组中插入一个正数n,因此,解决问题的 n 关键是找到要出入正数n的位置。需要考 虑如下问题?
11
5.1 循环程序设计 5.1.1 循环程序的结构形式
循环程序结构形式
初始化 初始化
控制条件
Y
N N
循环体 控制条件
Y
循环体
DO-WHILE 结构
DO-UNTIL 结构
12
5.1 循环程序设计 5.1.1 循环程序的结构形式
循环程序结构说明
初始化: 设置循环的初始状态 循环体: 循环的工作部分及修改部分 控制条件:计数控制(LOOP) 特征值控制(LOOPZ/LOOPNZ/ 条件跳转指令)
开始

汇编语言第五、六章:循环与分支程序设计

汇编语言第五、六章:循环与分支程序设计
②程序开始时,执行如下指令
PUSH DS MOV AX,0 PUSH AX ③用户程序结束时,用RET指令
程序结束的方法
(2)使用DOS功能调用的“INT 21H”指令,实现 用户程序结束,返回DOS
方法:在程序结束前,使用如下指令 MOV AH,4CH INT 21H
注意:一般情况下,使用第2种方法结束用户程序。
3.与简化段定义有关的预定义符号
汇编程序给出了与简化段定义有关的一组预定义符号,它们可在程 序中出现,并由汇编程序识别使用。有关的预定义符号如下:
(1)@code 由.CODE 伪指令定义的段名或段组名。 (2)@data 由.DATA 伪指令定义的段名,或 由 .DATA 、.DATA?、.CONST和 .STACK所定义的段组名。 (3)@stack 堆栈段的段名或段组名。
第一节:循环结构
初始化
循环体
修改部分 Y
控制条件 N
结束
循环的初始状态
循环的工作部分 及修改部分
计数控制循环 条件控制循环
ห้องสมุดไป่ตู้
第五章第循一环章与基分础支知程识序设计
第五章第循一环章与基分础支知程识序设计
循环程序设计
根据条件重复执行一段指令就构成了循环程序结构 。
例:将ARRAY数组中的50个数求和,并将和存入字变量S中 。
……
00110001
16. 0 1 0 0 0 0 1 0 0 0 1 1 0 0 0 0 (ROL DX,1) 0 0 0 0 0 0 0 1 (AND)
00000000 + 0 0 1 1 0 0 0 0 (ADD)
00110000
binbuf 30 31 30 30 30 30 31 30 30 30 31 31 30 30 30 30 返回

汇编语言程序设计_第5章 分支循环程序设计(参考答案)

汇编语言程序设计_第5章 分支循环程序设计(参考答案)

第5章分支、循环程序设计本章要点: 转移指令的寻址方式及其执行过程,控制转移类指令的使用,分支和循环程序的设计和应用。

程序调试的方法,常见问题的程序设计方法。

一、单项选择题5.1.1条件转移是根据标志寄存器中的标志位来判断的,条件判断的标志位共有( B )位。

A. 4B. 5C. 6D. 95.1.2用一条条件转移指令一次可以实现( A )个分支。

A. 2B. 3C. 4D. N5.1.3 条件转移指令的转移范围是(A)。

A. -128~127B. 0~255C. 0~65535D. -32768~327675.1.4 设A为字变量,B为标号,下列指令中不正确的是(D)。

A. MOV AX,AB. JNZ BC. JMP [SI]D. JMP B[BX]5.1.5 下述指令中影响CF标志位的是(A)。

A. SHL AL,1B. MOV AL,1C. JC LD. JNC L5.1.6 下述指令中不影响CF标志位的是(A)。

A. INC SIB. SUB SI,0C. NEG ALD. TEST AL,15.1.7 在多重循环程序设计中,每次通过外层循环进入内层循环时,其内层循环的初始条件(B)。

A. 不必考虑B. 必须重新设置C. 必须清0D. 必须置15.1.8 当设计一个程序时,最重要的是(B)。

A. 程序的结构化B. 能使程序正常运行并实现功能C. 程序的执行速度快D. 程序占用的存储空间小*5.1.9 如果“JNC L”指令的操作码放在0040H,转移后在0020H处取下一指令的操作码,那么这条指令的位移量是(C)。

A. 1EHB. 20HC. 0DEHD. 0E0H*5.1.10 如果“JGE P”指令的操作码放在0050H,该指令的位移量是34H,执行完这条指令转移取下一条指令的偏移地址是(C)。

A. 82HB. 84HC. 86HD. 88H二、填空题5.2.1 当下面循环程序中的划线处填上一个什么数字时,执行的循环次数最多?MOV CX,____0______MOV AX,0L:INC AXLOOP L5.2.2 当两个数进行比较后,执行__JE L(JZ L)表示两数相等则转移到L。

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

第5章 循环与分支程序设计
2018/11/8
CH5
5.1 循环程序设计
循环结构一般是根据某一条件判断为真
或假来确定是否重复执行循环体
循环指令和转移指令可以实现循环控制
2018/11/8
CH5
● 循环程序结构形式
初始化
初始化
控制条件
Y
N N
循环体 控制条件
Y
循环体
DO-WHILE 结构
DO-UNTIL 结构
2018/11/8
2018/11/8
CH5
(3)循环控制条件 循环次数已知,可以使用: ●LOOP指令实现,但是必须注意: 循环移位指令中使用CL寄存器作为 移位次数寄存器,LOOP 指令的循 环次数隐含在CX寄存器中,避免这 两者之间的冲突。
● 条件跳转指令实现。
LOOP AGAIN DEC 计数器 JNZ AGAIN
xor ax,ax push ax X dw 5 1.简单的加减法运算,直接用加减法指令实现 mov ax,data Y dw 6 mov ds,ax 2. 数据存储方式 : 字节、字、双字、四字等 W dw 7 mov ax,Y Z dw ? 3.寻址方式:直接寻址 sub ax,X data ends add ax,W mov Z,ax code segment ret
2018/11/8
CH5
开始 初始化CX=0 Y
N
Y=0? N
Y=-? Y
CX←CX+1 Y逻辑左移1位
;移位
; ’0’~’9’ ASCII 30H~39H
; ’A’~’F’ ASCII 41H~46H
2018/11/8
CH5
方法2 (条件跳转指令)
rotate:

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

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

第5章循环与分⽀程序设计第5章循环与分⽀程序设计1.教学⽬的:掌握DOS系统功能调⽤的字符I/O及微型汇编语⾔程序分析和设计⽅法。

2.教学要求:①会使⽤DOS系统功能调⽤输⼊输出字符及字符串②掌握汇编语⾔的顺序、分⽀、循环程序的设计。

3.教学重点:①循环、分⽀程序的设计。

4.掌握难点:①循环程序设计②分⽀程序设计5.教学进程安排:P160~P1926.教学⽅法:课堂讲授7.教学内容摘要:5.1 DOS系统功能调⽤--字符I/O5.1.1 DOS系统功能调⽤表5.1 DOS系统功能调⽤--字符I/O5.1.2 DOS系统功能调⽤指令格式1、输⼊单个字符(AH=01H)格式: mov ah,01hint 21h出⼝参数:al<-输⼊字符的ASCII码例:从键盘上输⼊数字5...mov ah,1 ;设置功能号int 21h ;系统功能调⽤sub al,30h ;字符的ASCII码->⼆进制... ;5的ASCII码 35h-->05h2、输出单个字符(AH=02H)格式: mov ah,02hint 21h⼊⼝参数:dl<-输出字符的ASCII码例:输出3+5的和8...mov al,3 ;al<-⼀个加数add al,5 ;两数相加mov dl,al ;dl<-和add dl,30h ;ASCII码<-和的⼆进制 mov ah,2 ;设置功能号int 21h ;输出字符83、输⼊字符串(AH=0AH)格式: mov ah,0Ahint 21h⼊⼝参数:ds:dx<-缓冲区⾸地址(ds:dx)=设计的最⼤字符数出⼝参数:(ds:dx+1)=实际输⼊的字符数例:输⼊⼀个字符串(最多20个字符) buf db 20db ?db 20 dup(?)...mov ax,seg buf ;mov ds,ax ;lea dx,buf;等同于mov dx,offset bufmov ah,0Ah ;设置功能号int 21h ;4、输出字符串(AH=09H)格式: mov ah,09hint 21h⼊⼝参数:· ds:dx<-字符串⾸地址·字符串必须⽤'$'作为结束符例:输出⼀个字符串str1 db 'computer.',0dh,0ah,'$' str2 db '3+5=','$'...mov ax,seg str1 ;取str1的段地址 mov ds,axlea dx,str1 ;取str1的偏移地址 ;等同于mov dx,offset str1mov ah,09h ;设置功能号int 21h ;输出computer.lea dx,str2 ;取str2的偏移地址 ;等同于mov dx,offset str2mov ah,09h ;设置功能号int 21h ;输出 3+5=5、返回DOS(AH=4CH)格式: mov ah,4chint 21h例:code segmentassume cs:code ...mov ah,4ch ;设置功能号 int 21h ;系统功能调⽤ code ends end5.2 汇编语⾔程序设计结构5.2.1 汇编语⾔程序设计的基本结构三种基本结构:①顺序结构②循环结构③分⽀结构图5.1 顺序结构图图5.2 循环结构图图5.3 分⽀结构图5.3 循环程序设计5.3.1 循环程序结构循环程序结构可以总结为两种结构形式,如图5.4所⽰。

第五章循环与分支程序PPT课件

第五章循环与分支程序PPT课件
因此,需将输入的数字乘以2作为偏移量。 关键要理解JMP指令的间接寻址方式
地址表的安排:
14
地址表法
例:根据8位寄存器al中哪一位为1(从低位往高 位流程)图,把程序转移到8个不同的程序分支去。 方法1:利用“寄存器间接寻址方式”实现,判断
方向是从低位往高位 约定:AL作为控制转移的寄存器
BX存放转移地址的地址
8
单分支程序设计
例2:计算AX的绝对值
SUB ax, 0
jge nonneg
;条件满足(AX≥0)?
neg ax
;条件不满足,求补
nonneg: mov result, ax ;条件满足
9
单分支程序设计
例3:将AX中存放的无符号数除以2,如果是奇数, 则加1后除以2
test ax,01h ;测试AX最低位 jz even1 ;最低位为0:AX为偶数 add ax,1 ;最低位为1:AX为奇数,需要加1 even1:rcr ax,1 ;AX←AX÷2
《汇编语言》
第五章 循环与分支程序设计
回顾
汇编语言语句格式 基本伪指令和操作符
EQU/=、+-*/、DB/DW/DD、?/DUP、ORG/ $、OFFSET/SEG/PTR、END、SEGMENT/ENDS 完整段定义源程序格式 汇编语言源程序的编辑、汇编、连接和调试
2
目标
基本程序结构
顺序结构、分支结构、循环结构 简单汇编语言程序设计;
dec ah
;等效于cmp ah,1
jz function1 ;ah=1,转向function1
;ah=2,转向function2
13
多分支程序设计
地址表法(跳跃表法) 地址表法的设计要领:

汇编-循环与分支程序设计

汇编-循环与分支程序设计

方法A
MOV DL,0DH MOV AH,06H INT 21H MOV DL,0AH MOV AH,06H INT 21H
方法B
MOV DL,0AH MOV AH,06H INT 21H MOV DL,0DH MOV AH,06H INT 21H
记住以下ASCII值
退格:08H(即8) 空格:20H(即32) 换行:0AH(即10) 回车:0DH(即13) 0 :30H(即48) a :61H(即97) A :41H(即65)
程序流程图
开始
DX=A
DX=A+B BX=DX DX左移3位 BX左移1位
DX=BX+DX-500
结束
编写程序
DATA BUFA BUFB RESULT
SEGMENT DW ? DW ? DW ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: CODE
➢ 循环控制部分:判断循环条件满足与否,常用方法:计数控制、特 征值控制、地址边界控制等。
➢ 常用指令
[1].LOOP,LOOPZ/LOOPE,LOOPNZ/LOOPNE;
[2].各种跳转指令;
特别要注意循环入口和循环次数的正确设置、地址指针及循环控
制条件的修改等。否则会得不到期望的结果。
➢ 多重循环程序设计循环嵌套
INT 21H
不回显在屏幕上
2.键盘一次输入一个字符串的方法:
串地➢址例存如入(,DS在:D数X)据、调区用定参义数的为字10送符A缓H冲区如下:
MOV MOV MOV MOV MOV
DABADDAXuHSX,f,,,TfASAO0eEXfArGf,Hsc/eSASBo/tBEuu设TCufnGRf置BftTMfueILeNIr/frENE/fGT/设e/NN/r/置BTB/2uu/1存ffBHDffDuD功入eefBBBrrf能字是的er参符存段的33?数串放地偏22 为的输址移D0最入U存地APH大字入址(长符D存S?度串入)并的DX存缓入冲B区uffer的首字节;

第五章 循环与分支程序设计

第五章 循环与分支程序设计
12
continue: add loop mov loop ……
2. 分支程序设计
? ? … case 1 case 2 case n case 1 case 2 case n
CASE 结构
(1) 逻辑尺控制 (2) 条件控制
IF-THEN-ELSE 结构
(3) 地址跳跃表(值与地址有对应关系的表) 地址跳跃表(值与地址有对应关系的表)
13
x(x1,x2,…… x2,……,x10) 例:有数组 x(x1,x2,……,x10) 和 y(y1,y2,……,y10), (z1,z2,…… z2,……,z10) 编程计算 z(z1,z2,……,z10) z1 = x1 z2 = x2 z3 = x3 z4 = x4 z5 = x5 z6 = x6 z7 = x7 z8 = x8 z9 = x9 + y1 + y2 - y3 - y4 - y5 + y6 - y7 - y8 + y9
3
1. 循环程序设计
初始化
初始化
N N
控制条件
Y
循环体 控制条件
Y
循环体
DO-WHILE 结构
DO-UNTIL 结构
4
初始化:设置循环的初始状态 循环体:循环的工作部分及修改部分 控制条件:计数控制
特征值控制 地址边界控制
5
例:把 BX 中的二进制数以十六进制的形式显示在屏幕上
BX
1
2 3
4je lea L: shr jnb jmp add1: add jmp continue: …… routine1: …… routine2: …… al, 0
(寄存器间接寻址) 寄存器间接寻址)
continue bx, branch_table ;逻辑右移 al, 1 逻辑右移 ;jnb=jnc add1 ;段内间接转移 word ptr[bx] bx, type branch_table L
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
INC SI LOOP AGAIN
;计数器减1,不为0继续循环
5
一、循环控制指令(例)
MOV CX,COUNT XOR BX,BX MOV AL,20H
;设置循环次数
MOV SI,OFFSET STRING
;BX清0,用于记录空格数
AGAIN: CMP AL,[SI]
JNZ NEXT INC BX NEXT: INC SI LOOP AGAIN
第五章 循环与分支程序设计
§5.1 循环与转移指令
§5.2 循环程序设计 §5.3 分支程序设计
1
§5.1 循环与转移指令
一、循环控制指令
二、转移指令
控制转移类指令通过改变IP(和CS)值,实现程序执 行顺序的改变
2Hale Waihona Puke 一、循环控制指令 8086指令系统的循环控制指令均为二字节指令

一字节为转移的相对位移量(8位带符号的二进制数) IP ← IP+相对位移量
段内间接寻址转移
JMP r16/m16 ;IP←r16/m16
将一个16位寄存器或主存字单元内容送入IP寄存器,作为新 的指令指针,但不修改CS寄存器的内容
JMP AX ;IP←AX JMP WORD PTR [BX] ;IP←[BX]
13
段间直接寻址转移
JMP far ptr label ;IP←label的偏移地址 ;CS←label的段基值 将标号所在段的段基值作为新的CS值,标号在该段内的偏移 地址作为新的IP值;程序跳转到新的代码段执行 JMP FAR PTR OTHERSEG
设字符的ASCII码在AL寄存器中。将字符加上奇校验位:在 字符ASCII码中为“1”的个数为奇数时令其最高位为“0” ,否则令最高位为“1”
AND AL,7FH;最高位置“0”,同时判断“1”的个数
JNP NEXT
;个数已为奇数,则转向NEXT
OR AL,80H
NEXT: ...
;否则,最高位置“1”
;被加数ax清0 ;从100,99,...,2,1倒序累加 ;将累加和送入指定单元
34
开始 1的个数计数器←0
例5.2 在ADDR单元存放着数Y 的地址,试编制一程序把Y中1 的个数存入COUNT单元中
循环次数计数器CX←16 Y左移一次 N CF=1
Y
1的个数计数器+1 CX ←CX-1=0 N

转移范围可以用一个字节表达,在段内 -128~+127范围的转移
代 码 段
10
1.无条件转移指令 —目标地址的范围:段间
段间转移——远转移(far)

从当前代码段跳转到另一个代码段,可以 在1MB范围
需要更改CS段基值和IP偏移地址

代 码 段

目标地址必须用一个32位数表达,叫做 32位远指针,它就是逻辑地址
;重复比较两个字符 ;ZF=0(不等),转移 ;顺序执行(相等)
;重复比较两个字符 ;ZF=1(相等),转移
;顺序执行(不等)
21
2. 条件转移指令— JS/JNS指令
计算|X-Y|(绝对值)。X和Y为存放于X单元和Y单元的16 位操作数,结果存入RESULT。 MOV AX,X SUB AX,Y JNS NONNEG NEG AX NONNEG: MOV RESULT,AX
24
2.条件转移指令— JC/JNC指令
记录BX中1的个数 XOR AL,AL AGAIN: TEST BX,0FFFFH JZ NEXT SHL BX,1 JNC AGAIN
;AL=0,CF=0 ;等价于 CMP BX,0
INC AL
JMP AGAIN NEXT: ...
;AL保存1的个数
25
器操作数表达
转移地址在寄存器或主存单元中,就是通过寄存器或存 储器的间接寻址方式
9
1. 无条件转移指令 —目标地址的范围:段内
段内转移——近转移(near)

在当前代码段64KB范围内转移 ( ±32KB范围)
不需要更改CS段基值,只要改变IP偏移 地址
代 码 段

段内转移——短转移(short)
2.条件转移指令
—无符号数的比较
无符号数的大小用高(Above)低(Below)表示 利用CF确定高低、利用ZF标志确定相等(Equal) 两数的高低分成4种关系:
⑴高于(不低于等于): JA ( JNBE ) ⑵高于等于(不低于): JAE ( JNB ) ⑶低于(不高于等于): JB(JNAE)
;若AX≥BX,转移
XCHG AX,BX;若AX<BX,交换
结果:AX保存较大的有符号数
29
2. 条件转移指令
JCXZ label
—计数器CX为0转移
;CX=0,发生转移:IP←IP+8位位移量
;CX≠0,顺序执行
CX寄存器通常在程序中用做计数器
JCXZ指令用来判断计数是否为0
30
§5.2 循环程序设计
一、循环程序的结构形式
二、循环程序设计 三、多重循环程序设计
31
一、循环程序的结构形式
初始化 循环体 修改部分 计数控制循环 条件控制循环 循环的初始状态
循环的工作部分 及修改部分
Y
控制条件 N
先循环,后判断
结束
32
一、循环程序的结构形式
初始化
N 循环的初始状态 计数控制循环 条件控制循环
控制条件 Y
⑷低于等于(不高于): JBE(JNA)
26
2. 条件转移指令
—无符号数的比较(例)
;若AX≥BX,转移
CMP AX,BX ;比较AX和BX
JAE NEXT
NEXT: ...
XCHG AX,BX;若AX<BX,交换
结果:AX保存较大的无符号数
27
2. 条件转移指令
—有符号数的比较
有符号数的大(Greater)小(Less)需要组合OF 、SF标志,并利用ZF标志确定相等(Equal) 两数的大小分成4种关系:
结束
循环体
修改部分
先判断,后循环
循环的工作部分 及修改部分
33
二、循环程序设计(例)
.model small .stack 256 .data sum dw ? .code .startup xor ax,ax mov cx,100 again: add ax,cx loop again mov sum,ax .exit 0 end
;计数器减1,不为0继续循环 ;ZF=0,非空格,转移 ;ZF=1,是空格,个数加1
6
二、转移指令
无条件转移指令
条件转移指令
7
无条件转移指令
JMP label
NEAR FAR
;程序转向label标号指定的地址
只要执行无条件转移指令JMP,就使程序转到指定的目标 地址处,从目标地址处开始执行那里的指令 JMP指令分成4种类型:
实际编程时,汇编程序会根据目标地址的距离,自 动处理成短转移、近转移或远转移 程序员可用操作符short、near ptr 或far ptr 强制
代 码 段
11
段内直接寻址转移
JMP label
;IP←IP+位移量
实际为相对寻址
位移量是紧接着JMP指令后的那条指令的偏移地址,到目标 指令的偏移地址的地址位移
⑴ 判断单个标志位状态
⑵ 比较无符号数高低
⑶ 比较有符号数大小 ⑷ 判断计数器CX为0
18
助记符 JC JNC JZ/JE JNZ/JNE JS JNS
标志位
CF=1 CF=0 ZF =1 ZF =0 SF =1 SF=0
助记符 JA/JNBE JAE/JNB JB/JNAE JBE/JNA JG/JNLE JGE/JNL
Y
COUNT ← 1的个数计数器 结束
循环次数固定,完全由循环计数器控制
35
EIP ← EIP+相对位移量
短转移

隐含使用CX作为循环计数器
程序中的某段需反复执行若干次时,用循环来实现
3
一、循环控制指令
LOOP label
;CX←CX-1,CX≠0,循环到标号label
LOOPE/LOOPZ label
等于时循环
;CX←CX-1,CX≠0 且ZF=1,循环到标号label
标志位
CF=0且ZF=0 CF=0或ZF=1 CF=1且ZF=0 CF=1或ZF=1 SF=OF且ZF=0 SF=OF或ZF=1
JP/JPE
JNP/JPO JO JNO
PF =1
PF =0 OF =1 OF =0
JL/JNGE
JLE/JNG JCXZ
SF≠OF且ZF=0
SF≠OF或ZF=1
CX=0
实际虽然指令只有19条,但却有31个助记符 采用多个助记符,只是为了方便记忆和使用
2. 条件转移指令
Jcc指令的操作数label是一个标号

一个8位位移量是相对于当前IP的,且距当前IP地址- 128~+127个单元的范围之内,属于段内短距离转移
Jcc指令为2个字节,条件不满足时的顺序执行就是 当前指令偏移指针IP加2
17
2. 条件转移指令—指令的分类
Jcc指令不影响标志,但要利用标志。 根据利用的标志位不同,19条指令分成4种情况:

⑴ 小于(不大于等于):JL(JNGE) ⑵小于等于(不大于):JLE(JNG) ⑶大于(不小于等于): JG ( JNLE )
⑷大于等于(不小于): JGE ( JNL )
28
2. 条件转移指令 —有符号数的比较(例)
CMP AX,BX ;比较AX和BX
相关文档
最新文档