当前位置:文档之家› 汇编语言程序设计第五章 循环与分支程序设计

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


start
;end assembly
16
5.2 分支程序设计 5.2.1 分支程序的结构形式
Y
处理1
条件满足?
N
处理2 处理1
判断条件
处理2

处理n
IF_THEN_ELSE结构
CASE结构
17
5.2.2 分支结构设计方法

一般利用条件转移指令来产生。
(1)单条件,测试某次运算结果(P88) A、ZF,0或相等:JZ(JE)、JNZ(JNE) B、SF,符号:JS、JNS C、OF,溢出:JO、JNO D、PF,奇偶位:JP、JNP E、CF,进位:JB(<)、JNAE(≯=)或JC JNB(≮)、JAE(≥)或JNC
;main part of prognam main proc far assume cs:prgnam,ds:datarea ;starting execution address start: ;set up stack for return ;save old data segment push ds ;put zero in AX sub ax,ax ;save it on stack push ax ;set ds register to current data segment ;datarea segment addr mov ax,datarea ;into DS register mov ds,ax
(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

5
开始
初始化循环记数值
BX循环左移一个数位 把最右边的数位转换为ASCⅡ 是 ASCⅡ A~F? Y 加上7 显示一个字符 N Y N
记数值-1 =0?
结束
返回例题
6
下面是以BIN2HEX.ASM为文件名建立的源文件
prognam main segment ;define code segment proc far assume cs:prognam ;starting execution addr ;save old data segment ;put zero in AX ;save zero on stack
1 8 16 84 32 5
2 16 84 32 8 5
3 84 32 16 8 5
13
程序的结构框图如图所示
(COUNT1)
N -1
(COUNT2) I
(COUNT1) 0 Y
开始
AI ≥ AI+1 ? N AI AI+1
I=I+1
(COUNT2) (COUNT2) -1
N
(COUNT2)=0?
2
循环程序设计过程

框图:
次数:4
初值
取一个十六进数
显示
循 环 体
循环 控制
3
次数-1 =0?
结束
取一个十六进制数
1 0 1 1 0 1 0 1 0 1 1 1 0 1 0 0

BX
B
5
7
4 B 5
5 7 4 B
7 4 B 5
4 B 5 7
B 5 7 4
7 4
4
显示十六进数字符
利用DOS功能调用(#2功能):DL←ASCII码 十六进数字符:0┅9,A┅F. ASCII码:30H┅39H,41H┅46H 算法:1,十六进数+30H 2,>39H? 3,YES 再加07H NO 不操作 4,结束
;the following instruction delete an element from the list as follows: ;(1) if the element lies at the end of the list, delete it by decreasing ; the element count by 1.
start: ;set up stack for return push ds xor ax,ax push ax :main part of prognam mov ch,4 rotate: mov cl,4 rol bx,cl mov al,bl and al,0fh add al,30h cmp al,3ah jl printit add al,7h
;number of digits ;set count to 4 bit ;left digit to right ; move to AL ;mask off left digit ;convert hex to ASCⅡ ;is it >9? ;jump if digit=0 to 9 ;digit is A to F
;set count1 ;to n-1 ;save count1 in di ;clear bx ;load a(i) into ax and compare ;with a(i+1) ;swap if ;a(i)<a(i+1) and store greater ;number ;increment index ;if not the end of a pass,repeat ;restore count1 for the either loop ;if not the final pass,repeat ;return to dos ;end of main part of prognam ;end of code segment
;if(CX)=0,delete last ele ;move one ele up in list
;point to next ele ;repeat untill all ele moved ;decrease ele count by 1 ;exit ;end of main part of prog
11
;(2)otherwise, delete the element by moving all subsequent elements up by one position. delete: next_el:
dec_cnt:
exit: del_ul
jcxz dec_cnt mov bx,es:[di] mov es:[di-2],bx add di,2 loop next_el pop di dec word ptr es:[di] ret endp
思路: 1、因为已排序,采用折半查找法以提高查找效率。 2、先取中间元素,如果相等则查找成功;如果比中间元素 大,则再取高半部的中间元素进行比较;如果比中间元素小 ,则再取低半部的中间元素进行比较。 3、重复2过程直到查找成功或最终未找到该数为止。 4、顺序查找法平均N/2次,折半法平均比较次数为log2N
7
printit: mov dl,al mov ah,2 int 21h dec ch jnz rotate ret main endp prognam ends end start
;put ASCⅡ char in DL ;display output function ;call DOS ;done 4 digits? ;not yet ;return to DOS ;end of main part of prog ;end of segment ;end of assembly
15
mov dec mov loop1: mov mov loop2: cmp jge xchg mov continue: add loop mov loop ret endp main Prognam ends end
cx,n cx di,cx bx,0 ax,a[bx] ax,a[bx+2] continue ax,a[bx+2] a[bx],ax bx,2 loop2 cx,di loop1
Back
12
多重循环程序设计

例 5.7 有一个首地址为A的N字数组,请编制一
程序使该数组中的 数按从大到小的次序排序。
我们采用冒泡排序算法从第一个字开始依次对相邻两个数进 行比较,如次序对则不做任何调整;如次序不对则这两个数交换 位置。下表表明了这种算法的例子:
序号 1 2 3 4 5 数 8 5 16 84 32 比较遍数
第五章 循环与分支程序设计
编制一个汇编语言程序的步骤如下:
1)分析题意,确定算法。 2)根据算法画出程序框图。 3)根据框图编写程序。 4)上机调试程序。
5.1 循环程序设计
循环程序可由以下三部分组成:
1)设置循环的初始状态:循环次数、指针设置、 初值。 2)循环体。 3)循环控制:修改指针、改变次数、判断条件。
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。
18
(2)根据无符号数比较结果进行转移(P89)
相关主题