第五章循环与分支程序设计
汇编语言第五、六章:循环与分支程序设计
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讲 循环与分支程序设计
; ’0’~’9’ ASCII 30H~39H
; ’A’~’F’数 n 插入一个已整序的正数字数组
loop和[bx]的联合应用
• 计算ffff:0~ffff:b单元中的数据的和,结 果存储在dx中。 • 分析: 怎样解决这两个看似矛盾的问题? 目前的方法(在后面的课程中我们还有 别的方法)就是我们得用一个16位寄 存器来做中介。
loop和[bx]的联合应用
• 我们将内存单元中的 8 位数据赋值到 一个16位寄存器ax中,再将ax中的数据 加到dx上,从而使两个运算对象的类 型匹配并且结果不会超界。
一段安全的空间
• 在8086模式中,随意向一段内存空间写 入内容是很危险的 ,因为这段空间中 可能存放着重要的系统数据或代码。 • 比如下面的指令: mov ax,1000h mov ds,ax mov al,0 mov ds:[0],al
一段安全的空间
• 我们以前在Debug中,为了讲解上的方便, 写过类似的指令。 • 但这种做法是不合理的 ,因为之前我们并 没有论证过 1000:0中是否存放着重要的系统 数据或代码。 • 如果1000:0中存放着重要的系统数据或代码, “mov ds:[0],al” 将其改写,将引发错误。 •
在循环开始前设(bx)=0,每次循环,将bx中 的内容加1即可。
loop和[bx]的联合应用
• 分析: (续)更详细的算法描述初 始化
(ds)=0ffffh (bx)=0 (dx)=0 (cx)=12 循环12 次: s:(al)=((ds)*16+(bx)) (ah)=0 (dx)=(dx)+(ax) (bx)=(bx)+1 loops
Loop指令
• 任务3:编程计算2∧12。 分析: 2∧12=2*2*2*2*2*2*2*2*2*2*2*2,若设 (ax)=2,可计算: (ax)= (ax)*2*2*2*2*2*2*2*2*2*2*2,最 后(ax)中为2∧12的值。N*2可用N+N 实现。
汇编语言程序设计_第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章 循环与分支程序设计
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.1.2 循环程序设计方法
无论使用哪种循环结构,循环程序一般应包括 以下几部分: ➢ 循环初始化。它包括设置循环次数的初始值、地址 指针的初始设置等。 ➢ 循环体。这是循环工作的主体,包括要重复执行的 操作,以及循环的修改部分。修改部分包括地址指 针的修改、循环控制条件的修改等。 ➢ 循环控制部分。它是控制循环的关键,判断循环条 件满足与否。
特别要注意循环入口和循环次数的正确设置、 地址指针及循环控制条件的修改等。否则会得不到 期望的结果。
DATA
ENDS
这是一个初始循环次数不定、根据条件控制循环的例子
算法:先使用字符串指令进行块 查找,若找到则显示“Duplication!
MOV DX,0
例5.1 试编 MOV CL,10
分析:采用折半查找法可以提高对有序表的查表效率。
JMP SHORT EXIT
制一个程序, MOV BX,TAB[SI] ;元素前移为插入的数字腾位置 MOV TAB[SI-2],BX
ADD SI,2
;修改地址指针
把BX寄存 JMP SHORT COMPARE
A: MOV AH,9H
LEA DX,PRT
器中的二进 INT 21H
JMP EXIT
B: MOV TAB[SI-2],AX ;插入元素
CN
DW ($-BUFFER)/2 ;元素个数
MAX
DW ?
;存放最大数单元MINDW ?;存放最小数单元
第5章 顺序、分支和循环程序设计
表5-4
带符号数的条件转移指令
其中:A、B为两个有符号数
助记 符
功
能
转移条件
实例描述
JZ/JE
结果为零/相等时转移
ZF=1
A=B
JNZ JNE
/
结果不为零/不相等时转 移
ZF=0
A≠B
JG / JNLE
JGE JNL /
大于/不小于且不等于时 转移
大于等于/不小于时转移
SF=OF ZF=0
SF=OF ZF=1 SF≠OF ZF=O SF≠OF ZF=1
结果不为零/不相等时转移
JS
JNS JO JNO JP/JPE
结果为负数时转移时转移
结果为正数时转移 有溢出时转移时转移 无溢出时转移 偶校验时转移
SF=1
SF=0 0F=1 0F=0 PF=1
JNP/JPO
奇校验时转移
PF=0
假如:比较两数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程序段 ;L2程序段
33循环程序设计循环程序设计共共66学时学时编写程序的一般步骤编写程序的一般步骤分析问题分析问题算法设计画出流程图算法设计画出流程图根据流程图编写源程序根据流程图编写源程序程序的调试与修改程序的调试与修改顺序程序设计在设计这种程序中顺序程序设计在设计这种程序中没有分支和循环没有分支和循环只要遵照算法按步骤顺序写出相应的指令即可只要遵照算法按步骤顺序写出相应的指令即可
第五章 循环与分支程序
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
分析题意,确定算法。找出合理的算法与适当的数据 结构 根据算法画出流程图 根据流程图编写程序 上机调试程序
汇编语言程序的结构组成
顺序结构 分支结构 循环结构 子程序的结构
4
《汇编语言》 汇编语言》
5.2 分支程序
目标
分支程序的结构及设计
双分支程序的结构及设计 多分支程序的结构及设计 单分支程序的结构及设计
算法
二分查找 地址址表实现多分支
6
分支程序的结构
分支程序
分支程序根据条件是真或假决定执行与否 判断的条件是各种指令,如SUB、CMP、TEST等执行后 形成的状态标志 转移指令Jcc和JMP可以实现分支控制
分支程序的结构形式
单分支 双分支 多分支
7
单分支程序设计
例1:计算X-Y的绝对值 mov ax,X sub ax,Y jns nonneg ;条件满足(X-Y≥0)? neg ax ;条件不满足,求补 nonneg: mov result,ax ;条件满足
11
双分支程序设计
例2:寄存器AL中是字母Y或y,则令AH=0;否则 令AH=-1 cmp al,’Y’ ;AL是大写Y否? jz next ;是,转移 cmp al,’y’ ;AL是小写y否? jz next ;是,转移 mov ah,-1 ;不是Y或y,AH=-1,结束 jmp done ;一定要跳过另一个分支体 next:mov ah,0 ;是Y或y,AH=0,结束 done:...
第五章 循环与分支程序设计
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
第5章 循环与分支程序设计PPT课件
END START
例5.3 在附加段中,有一个首地址为LIST和未经排序的字数组.在数组的第一 个字中,存放着该数组的长度,数组的首地址已存放在DI寄存器中,AX寄存器 中存放着一个数,要求编制程序,在数组中查找该数,如果找到此数,则把它从 数组中删除.
…
DS
X
ARRAY_HEAD
45
46
54
57
61
66
68
71
ARRAY_END
90
N
60
DATAREA SEGMENT
X
DW ?
ARRAY_HEAD DW 45,46,54,57,61,66,68,71
ARRAY_END DW 90
N
DW 60
DARAREA ENDS
PROGNAM SEGMENT MAIN PROC FAR
第五章 循环与分支程序设计
5.1 循环程序设计 5.2 分支程序设计 5.3 如何在实模式下发挥80386及其后继机型的优势
5.1 循环程序设计
一、循环程序的结构形式
循环初始状态
Y 循环控制条件
N 循环体
(1)设置循环的初始状态 (2)循环体 (3)循环控制部分
循环初始状态 循环体 N
循环控制条件 Y
Z8=X8-Y8 Z9=X9+Y9 Z10=X10+Y10
…
DATA SEGMENT
X
23
45
90
…
X DW 23,45,90,12,48,72,95,83,75,29 Y DW 36,53,27,89,51,28,46,94,27,65 Z DW 10 DUP(?) LOGIC DW 00DCH
循环与分支程序设计.
5.2 分支程序设计
一、分支程序的结构形式 分支程序的结构形式: 二分支 多分支
Y 判定条件 N
判定条件 …
IF_THEN_LESE结构
CASE结构
二、分支程序设计方法 1、折半查找算法 例3:在附加段中,有一个按从小到大顺序排列的无符号数数组,其首地址 存放在 DI寄存器中,数组中的第一个单元存放着数组长度。在AX中 有一个无符号数,要求在数组中查找(AX),如找到,则使CF=0,并 在SI中给出该元素在数组中的偏移地址;如未找到,则使CF=1。 (1)确定算法: 由于已经排序,因此可以采用折半查找算法。折半查 找法先取有序数组的中间元素与查找值相比较,如相 等则查找成功;如查找值大于中间元素,则再取高半 部的中间元素与查找值相比较;如查找值小于中间元 素,则再取低半部的中间元素与查找值相比较;如此 重复直到查找成功或未找到该数(查找不成功)为止。 在一个长度为 n的有序数组r中,查找元素k的折半查 找算法可描述如下: ①初始化被查找数组的首尾下标,low←1,high←n; ②若low>high,则查找失败,置CF=1,退出程序。 否则,计算中点:mid←(low+high)/2; ③ k与中点元素r[mid]比较。若k=r[mid],则 查找成功,程序结束;若k<r[mid],则转步骤④; 若k>r[mid],则转步骤⑤;
该注意在每次通过外层循环再次进入内层循环时,内层的初始条件必须重
新设置。如:最典型的就是起泡排序算法。
排序算法:从第一个数开始依次对相邻两个数进行比较。如次序对,则不
其它略。
做任何操作,如次序不对,则使两个数交换位置。如果有 N个 数要进行排序,则第一遍做了 (N-1)次比较后,最小的数已经 放到了最后,所以第二遍比较只需要考 (N-1)个数,即只需要 比较(N-2)次。第三遍则只需要做(N-3)次比较 … …总共最多 (N-1)遍比较就可以完成排序。
第五章 循环与分支程序设计
第五章:循环与分支程序设计 第五章:
在实际应用的程序中,通常碰到根据某一条件是否成立来进行逻辑判断, 以便确定程序的下一步执行,这就形成了分支结构程序.在汇编语言程序设 计中,分支结构程序设计是一种很重要的程序设计方法.循环结构是控制重 复执行某一程序段的基本程序结构.在高级语言中,普遍设置有专用的循环 语句作为实现循环程序的手段.在汇编语言程序设计中,循环程序的地位也 是极其重要的.从本质上看,循环程序结构是分支程序结构的一种特殊形式, 编程时,都是使用条件转移指令来控制循环的.
本章重点: 本章重点
1)掌握使用比较指令和其他有关指令产生的相应标志位,继而通过条 件转移指令来形成分支程序的设计方法. 2)掌握多路分支程序的结构形式以及多路分支程序的设计方法. 3)掌握循环程序的结构形式和程序设计方法. 课件具体内容请看:第五章
第五章 循环与分支程序设计
数据定义:要定义源串和目的串
00
n1
……
处理方法:MOVSB指令是字节传送指令, 它要求事先设置约定寄存器:
① ② ③ ④
1F
将源串的首偏移地址送SI,段地址为DS 目的串的首偏移地址送DI,段地址为ES 串长度送CX寄存器中 并设置方向标志DF
n2 ……
程序源代码请自己编写
23/62
OFFSET n1
14/62
例5.1、试编制一个程序把BX寄存器内的二进 制数用十六进制数的形式在屏幕上显示出来
分析问题:把BX寄存器中16位的二进制数 用4位十六进制数的形式在屏幕上显示
1、初始设置
循环次数:每次显示1个十六进制数(送显示 器相应的ASCII),循环次数=4,CH=4
2、循环体
根据任务,选择算法
X Y DB DB MOV CMP JG JZ MOV JMP BIG: MOV SAV: MOV ? ;被测数据 ? ;函数值单元 AL,0 X,AL BIG SAV AL,0FFH ;小于0 SHORT SAV AL,1 Y,AL ;大于0 ;保存结果
9/62
循环程序设计方法
有一段指令被重复多次执行
每4位二进制数转换成1位十六进制数的ASCII 调用DOS系统功能在屏幕上显示
3、循环控制转移
根据计数控制循环次数
流程图
15/62
BX
1
2 3
4
16/62
没有数据分配问题,直接编写程序代码段
prognam segment main proc far Assume cs:prognam start: push ds sub ax, ax push ax 初始化 rotate: 循环体 printit: mov dl, al mov ah, 2 int 21h dec ch jnz rotate 循环控制转移 ret 系统调用 显示1个字符 mov ch, 4 mov cl, 4 …
第5章循环与分支程序设计
第5章循环与分支程序设计【课前思考】 1. 编制一个汇编语言程序分哪几步? 2. 循环程序有哪两种基本结构?由几部分组成? 3. 设计算法时对可能出现的边界情况如何考虑? 4. 如何设置逻辑尺? 5. 什么是起泡排序算法? 6. 如何理解数组排序算法中采用的折半查找法? 7. 如何使用跳跃表法实现CASE结构?【学习目标】 了解并掌握循环程序的构造方法,尤其是对循环控制条件的设置以及可能出现的边界情况的考虑。
掌握起泡排序算法这种多重循环程序设计中的常用方法。
交换标志位的设置在此算法中更能提高效率。
学会在数组排序算法中采用折半查找法来提高查找效率。
学会使用跳跃表法实现CASE结构。
【学习指南】 掌握编程的四个步骤至关重要。
通过多看举例,学会正确分析理解题意、选择合适的数据结构及算法、坚持先画框图、选取有效指令编程、最后应当掌握运用调试手段进行调试。
学习多重循环程序设计前应熟练掌握单层循环程序设计的各种实现方法及实现细节,如对可能出现的边界情况的处理等。
学习起泡排序算法、折半查找法、跳跃表法之前,应首先理解传统实现方法。
【难重点】 循环控制条件的选择。
考虑循环算法时注意可能出现的边界情况。
静态地预置逻辑尺。
动态地修改标志位。
多重循环程序设计时应分别考虑各重循环的控制条件及其程序实现,相互之间不能混淆。
另外,应该注意在每次通过外层循环再次进入内层循环时,初始条件必须重新设置。
起泡排序算法是多重循环程序设计中的一种常用方法。
数组排序算法中可以采用折半查找法来提高查找效率。
CASE结构可以使用跳跃表法实现。
【知识点】 编制一个汇编语言程序的一般步骤 5.1 循环程序设计 5.1.1 循环程序的基本结构 5.1.2 循环程序设计方法举例 循环控制条件 边界情况的处理 逻辑尺 5.1.3 多重循环程序设计举例 起泡排序算法 交换标志位 5.2 分支程序设计 5.2.1 分支程序的基本结构 5.2.2 分支程序设计方法举例——折半查找法 5.2.3 跳跃表法一般说来,编制一个汇编语言程序的步骤如下: 1)分析题意,确定算法。
第5章循环与分支程序设计
编程方法-举例2
Data segment mess db 'Your Hex number is:$' bb db 00110100b, 00010010b Data ends Prognam segment assume cs: prognam, ds:data start: mov ax, data mov ds,ax lea dx, mess mov ah,9 int 21h
例5.7
• 有一个首地址为A的N字数组,请编制程 序使该数组中的数按照从大到小的次序 整序。
采用起泡排序算法 方法: 从第一个数开始依次对相邻两个数进行比 较。如次序对,则不做任何操作;如次序不 对,则将这两个数交换位置。
数据段
datarea segment n equ 12 ;此处修改 a dw n dup (?) datarea ends • 程序:例5.7
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,save_cnt ;否则 比较次数放cx mov di,start_addr ;将开始地址放 DI
续 mov cx, es:[di] ;取长度
add di, 2 Repne scasw je delete Pop di jmp short exit delete: jcxz dec_cnt Next_el: ;移动 mov bx, es: [di] mov es:[di-2], bx add di, 2 loop next_el
汇编语言程序设计第五章 循环与分支程序设计
B、SF∧OF=0:JNL(≮)、JGE(≥)
C、(SF∧OF)∨ZF =1:JLE(≤)、JNG(≯)
D、(SF∧OF)∨ZF =0:JNLE(≮=)、JG(>)
20
(4)测试CX或ECX的值为0转移指令(P91)
A、(CX)=0:JCXZ
B、(ECX)=0:JECXZ
21
例5.9:在附加段中,有一个按从小到大排列的无 符号数数组,其首地址放在DI寄存器中,数组中 的第一个单元存放着数组长度。在AX中有一个无 符号数,要求在数组中查找(AX),如找到,则使 CF=0,并在SI中给出该元素在数组中的偏移地址; 如未找到,则使CF=1。
(COUNT1)
Y (COUNT1) -1
Y 结束
N
(COUNT1)=0?
14
以下为程序的实现:
Datarea n a Datarea segment EQU 20 dw n dup(?) ends ;define data segment
Prognam segment ;
;define code segment
思路: 1、因为已排序,采用折半查找法以提高查找效率。 2、先取中间元素,如果相等则查找成功;如果比中间元素 大,则再取高半部的中间元素进行比较;如果比中间元素小 ,则再取低半部的中间元素进行比较。 3、重复2过程直到查找成功或最终未找到该数为止。 4、顺序查找法平均N/2次,折半法平均比较次数为log2N
2
循环程序设计过程
框图:
次数:4
初值
取一个十六进数
显示
循 环 体
循环 控制
3
次数-1 =0?
结束
取一个十六进制数
循环与分支程序设计
短转移
隐含使用CX作为循环计数器
程序中的某段需反复执行若干次时,用循环来实现
3
一、循环控制指令
LOOP label
;CX←CX-1,CX≠0,循环到标号label
LOOPE/LOOPZ label
等于时循环
;CX←CX-1,CX≠0 且ZF=1,循环到标号label
LOOPNE/NZ label
不等于时循环
;CX←CX-1,CX≠0且ZF=0,循环到标号label
4
一、循环控制指令(例)
MOV CX,COUNT XOR AX,AX AGAIN: ADD AL,[SI]
;设置循环次数
MOV SI,OFFSET DATA_BYTE
;BX清0,用于存放累加和
ADC AH,0
;远转移到代码段2的otherseg
14
段间间接寻址转移
JMP far ptr mem ;IP←[mem],CS←[mem+2] 用一个双字存储单元表示要跳转的目标地址。这个目标地址 存放在主存中连续的两个字单元中的,低位字送IP寄存器,高 位字送CS寄存器 MOV WORD PTR [BX],0 MOV WORD PTR [BX+2],1500H JMP FAR PTR [BX]
;转移到1500H:0
15
2.条件转移指令
Jcc label
;条件满足,发生转移:IP←IP+8位位移量
;条件不满足,顺序执行
指定的条件cc如果成立,程序转移到由标号label指定的
目标地址去执行指令;条件不成立,则程序将顺序执行 下一条指令
操作数label是采用短转移,称为相对寻址方式
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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
开始
初始化循环 计数值
BX循 环 左 移 一个数位
把最右面的数 位 转 换 为 ASCII
是 ASCII
N
A~F?
Y
加上7
(3)循环控制条件分析
●因为循环次数已知,可以使用LOOP指令实现 ,但是必须注意:由于循环移位指令中使用CL 寄存器作为移位次数寄存器,而LOOP 指令的 循环次数隐含在CX寄存器中,因此,必须注意 这两者之间的冲突。
第五章 循环与分支程序设计
第五章循环与分支程序设计
学习重点
1. 掌握基本程序结构(顺序结构、循环结构、 分支结构)及其汇编语言程序设计方法
2. 熟悉常见程序设计问题:
➢ 数据范围判断(0~9、A~Z、a~z) ➢ 字母大小写转换; ➢ 字符串传送、比较等操作 ➢ 求最大最小值、数据求和、统计字符个数 ➢ 数组排序,查找,插入,删除
;02号DOS功能调用 ;显示一个ASCII码字符
第五章循环与分支程序设计
5.1 循环程序设计
➢ 循环结构一般是根据某一条件判断为 真或假来确定是否重复执行循环体
➢ 循环指令和转移指令可以实现循环控 制
第五章循环与分支程序设计
● 循环程序结构形式
初始化
初始化
控制条件
N
循环体
Y
循环体
N
控制条件件
Y
例00:查表法,实现一位16进制数转换为ASCII码显示
data segment
ASCII db 30h,31h,32h,33h,34h,35h
db 36h,37h,38h,39h ;0~9的ASCII码
db 41h,42h,43h,44h,45h,46h;A~F的ASCII码
hex db 0bh ;任意设定一个待转换的一位16进制数
第五章循环与分支程序设计
程序结构
(1) 顺序结构 (2) 循环结构
(3)分支结构 (4) 子程序结构 …
(5)复合结构:多种程序结构的组合
第五章循环与分支程序设计
编写汇编语言程序的步骤
(1) 分析题意,确定算法 (2) 根据算法画出程序框图 (3) 根据框图编写程序 (4) 上机调试程序
第五章循环与分支程序设计
●除了可以使用LOOP指令之外,还可以使用条 件跳转指计 数 值 =0? Y 结束
LOOP AGAIN
第五章循环与分支程序设计
DEC 计数器 JNZ AGAIN
方法1 (LOOP)
……
mov cx, 4
;初始化
rotate: push cx
mov cl, 4
rol bx, cl
BX
1
2 3
4
第五章循环与分支程序设计
分析:(1)程序结构的确定 由题意应该把BX的内容从左到右每4位为一组在屏幕上显示出来,显然
这可以用循环结构来完成,每次显示一个十六进制数位,因而循环次数是已 知的,计数值为4。
(2)循环体的构成(算法确定) 循环体应该包括:二进制到所显示字符的ASCII之间的转换,以及每个字
mov al, bl
and al, 0fh
add al, 30h ; ’0’~’9’ ASCII 30H~39H
cmp al, 3ah
jl printit
add al, 7h
; ’A’~’F’ ASCII 41H~46H
printit: mov dl, al
mov ah, 2
int 21h
pop cx
loop rotate
……
第五章循环与分支程序设计
方法2 (条件跳转指令)
……
mov ch, 4
;初始化
rotate: mov cl, 4
rol bx, cl
mov al, bl
and al, 0fh
add al, 30h ; ’0’~’9’ ASCII 30H~39H
cmp al, 3ah
jl printit
mov al,hex
;AL 取 得 一 位 16 进 制 数 , 正 是 ASCII 码 表 中 位 移
and al,0fh xlat mov dl,al mov ah,2 int 21h ret main endp code ends end start
;只有低4位是有效的,高4位清0 ;换码:AL←DS:[BX+AL] ;入口参数:DL←AL
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 bx,offset ASCII
;BX指向ASCII码表
add al, 7h
; ’A’~’F’ ASCII 41H~46H
printit: mov dl, al
mov ah, 2
int 21h
dec ch
jnz rotate
符的显示。 需要了解相关知识:◆字符和其ASCII码之间的关系?
“0”~“9” 30H~39H, “A”~”F” 41H~5AH ◆如何显示一个字符? (a)将显示字符的ASCII码放入DL寄存器;(b)将AH的内容置为2(功能号) ;(c)执行INT 21H(DOS 功能调用)。
第五章循环与分支程序设计
5.0 顺序程序设计
➢顺序程序完全按指令书写的前后顺 序执行每一条指令,是最基本、最 常见的程序结构
➢一般纯粹的顺序结构的程序设计较 少。
第五章循环与分支程序设计
例0
WX+Y+Z
data segment
X dw 5
Y dw 6
Z dw 7
W dw ?
data ends
code segment
main proc far
DO-WHILE 结构
DO-UNTIL 结构
第五章循环与分支程序设计
● 循环程序结构说明
初始化: 设置循环的初始状态
循环体: 循环的工作部分及修改部分
控制条件:计数控制(LOOP) 特征值控制(LOOPZ/LOOPNZ/
条件跳转指令)
第五章循环与分支程序设计
例1:把 BX 中的二进制数以十六进制的形式显示在屏幕上 如:1011 0010 1111 1010 B B2FAH