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

24
1/24 第 5 第 第第第第第第第第第 第第第第第第第第 第第第第 第第第第 第第第第第 第第第第 第第第第第第第第第 ……

Upload: laszlo

Post on 28-Jan-2016

164 views

Category:

Documents


0 download

DESCRIPTION

……. 第 5 章 循环与分支程序设计. 程序结构: 顺序结构 循环结构 分支结构 子程序结构 复合结构:多种程序结构的组合. 编制汇编语言程序的步骤: (1) 分析题意,确定算法 (2) 根据算法画出程序框图 (3) 根据框图编写程序 (4) 上机调试程序 三种模式: 1 ) DOS 操作系统下的实模式; 2 ) 80286 开始的保护模式; - PowerPoint PPT Presentation

TRANSCRIPT

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

1/24

第 5章 循环与分支程序设计程序结构: 顺序结构 循环结构

分支结构 子程序结构

复合结构:多种程序结构的组合

……

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

2/24

• 编制汇编语言程序的步骤:

(1) 分析题意,确定算法

(2) 根据算法画出程序框图

(3) 根据框图编写程序

(4) 上机调试程序

• 三种模式: 1 ) DOS 操作系统下的实模式; 2 ) 80286 开始的保护模式; 3 )从 80386 开始的虚 86模式。

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

3/24

5.1 循环程序设计( 1 ) DO-UNTIL 结构

开 始

结 束

初 始 化 循环的初始状态

循 环 体 循环的工作部分及修改部分

控制条件 计数控制 特征值控制 地址边界控制

N

Y

( 1 ) DO-UNTIL 结构

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

4/24

• DO_WHILE 结构

( 2 ) DO_WHILE 结构 当循环次数有可能等于 0 的时候,应当用 WHILE 结构

开 始

结 束

初 始 化

控制条件

循环体

Y

N

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

5/24

5.1.2 循环程序设计方法例 5.1 把 BX 中的二进制数以十六进制的形式显示在屏幕上

。 BX

1

2

3

4

循环左移 4 位

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

6/24

开始

初始化循环次数

BX 循环左移 4 位

最左边的 4 位转换为 ASCII

ASCII 是A~F

显示一个字符

循环次数 =0

结束

加 7

NY

YN

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

7/24

mov ch, 4rotate: 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 add al, 7h ;’A’-’F’ ASCII 41H-46Hprintit: mov dl, al mov ah, 2 int 21h dec ch jnz rotate ret

Prognam segmentMain proc far assume cs:prognamStart: push ds sub ax,ax push ax

Main endpPrognam ends end

指定返回地址

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

8/24

例 5.4 将正数 n 插入一个已整序的字数组的正确位置。

Datarea segment x dw ? array_head dw 3,5,15,23,37,49,52,65,78,99 array_end dw 105 n dw 32Datarea endsPrognam segmentMain proc far Assume cs:prognam, ds:datareaStart: Push ds Sub ax,ax Push ax

Mov ax,datarea Mov ds,ax

不要这三句话报的错

不要这两句话报的错

确定返回地址

段首地址

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

9/24

mov ax, n mov array_head-2, 0ffffh mov si, 0

compare: cmp array_end[si], ax jle insert mov bx, array_end[si] mov array_end[si+2], bx sub si, 2 jmp short compare

insert: mov array_end[si+2], ax retMain endp… 返回到 DOS 操

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

10/24

例 5.5 设有数组 x(x1, … , x10) 和 y(y1, … , y10) ,编程计算

z1=x1 + y1

z2=x2 + y2

z3=x3 - y3

z4=x4 - y4

z5=x5 - y5

z6=x6 + y6

z7=x7 - y7

z8=x8 - y8

z9=x9 + y9

z10=x10 + y10

逻辑尺: 0 0 1 1 0 1 1 1 0 0

标志位为 1 : 减法

标志位为 0 : 加法

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

11/24

x dw x1,x2,x3,x4,x5,x6,x7,x8,x9,x10y dw y1,y2,y3,y4,y5,y6,y7,y8,y9,y10z dw z1,z2,z3,z4,z5,z6,z7,z8,z9,z10logic_rule dw 00dch

mov bx, 0 mov cx, 10 mov dx, logic_rule next: mov ax, x[bx] shr dx, 1 jc subtract add ax, y[bx] jmp short result ; 向前引用subtract: sub ax, y[bx] result: mov z[bx], ax add bx, 2 loop next

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

12/24

例 5.7 将首地址为 a 的字数组从大到小排序(起泡算法,多重循环)

a dw 100,30,78,99,15,-1,66,54,189,256 mov cx, 10 ;CX← 数组元素个数 dec cx ; 元素个数减 1 为外循环次数

loop1: mov di, cx ; di 保留外循环次数 mov bx, 0

loop2: mov ax, a[bx] ; 取前一个元素

cmp ax, a[bx+2] ; 与后一个元素比较 jge continue ; 前一个大于或等于后一个元素,则不进行交换 xchg ax, a[bx+2] ; 否则,进行交换 mov a[bx], ax

continue: add bx, 2 ; 下一对元素 loop loop2 ; 内循环尾 mov cx, di loop loop1 ; 外循环尾

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

13/24

5.2 分支程序设计

( 3 )地址跳跃表法 值与地址有对应关系的表

case 1 case 2 case n

?

Y N

( 1 ) CASE 结构 ( 2 ) IF-THEN-ELSE 结构

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

14/24

例 5.10 根据 AL 寄存器中哪一位为 1 (从低位到高位)把程序 转移到 8 个不同的程序分支去 。(寄存器间接寻址)

branch_table dw routine1

dw routine2

dw routine3

dw routine4

dw routine5

dw routine6

dw routine7

dw routine8

cmp al, 0 je continue Lea bx,branch_table

L : shr al, 1 ; 逻辑右移 jnb not_yet ;jnb=jnc jmp word ptr [bx]        ; 段内间接转移

not_yet : add bx, type branch_table jmp Lcontinue: …… routine1: ……routine2: ……

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

15/24

cmp al, 0 je continue mov si, 0

L : shr al, 1 ; 逻辑右移 jnb add1 ;jnb=jnc jmp branch_table[si] ; 段内间接转移

add1: add si, type branch_table jmp Lcontinue: …… routine1: ……routine2: …… ……

(寄存器相对寻址)

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

16/24

cmp al, 0 je continue lea bx, branch_table mov si, 7* type branch_table mov cx, 8

L : shl al, 1 ; 逻辑左移 jnb sub1 ;jnb=jnc jmp word ptr [bx][si]   ; 段内间接转移

sub1: sub si, type branch_table loop Lcontinue: …… routine1: ……routine2: …… ……

(基址变址寻址)

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

17/24

§5.3 分支程序设计一、转移指令:转移指令分两种:无条件转移指令和条件转移指令。 1、无条件转移指令 格式: JMP 目标地址

功能: JMP 指令是使程序无条件的转移到目标地址 指向的指令执行。

分类 : 段内转移 段间转移

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

18/24

分支程序设计

三、分支程序设计 有两种结构形式:①比较 /测试—分支结构;

②分支表(跳转表)结构。

1、用比较 /测试分支结构(即用条件转移指令实现程序分支)

通常一条转移指令只能产生两个分支。

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

19/24

分支程序设计

例:数据块间的搬移程序 要求把内存中一数据块(源数据块)传送到另一存储区(目的数据块)。

源块

目的块

源块

目的块

目的块

源块

… …

……

……

1. 两个数据块分离 2. 两个数据块部分重

① 源块首址<目的块首址

② 源块首址>目的块首址

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

20/24

数据块间的搬移程序

结论:

1、源数据块与目的数据块有分离 :数据传送任意

2、源数据块与目的数据块部分重叠:

①源块首址<目的块首址

从数据块末地址开始传送数据。

②源块首址>目的块首址

从数据块首地址开始传送数据

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

21/24

多路分支程序设计

多路分支采用条件转移指令实现存在的缺点:

① 要用 N 条条件转移指令才能实现 N+1 路分支。

②程序较长,且进入各路分支的时间不一致。

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

22/24

跳转表:多路分支程序设计

2. 跳转表

1) 某程序需 N 路分支 , 每路程序的入口地址分别为 :SUB1 、 SUB2 、…… SUBN ,把这些转移的入口地址组成一个表,叫跳转表。

2) 跳转表内由若干跳转指令组成。  

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

23/24

跳转表 1 :用入口地址组成跳转表 1:某程序需 N 路分支 , 每路程序的入口地址分别为 SUB1 、 SUB2 、…… SUBN,把这些转移的入口地址组成一个表,表内每两个字节存放一个入口地址的偏移量。查找第 N个分支在的跳转表中的地址:

(N- 1) * 2+表首址  表首址 分支 1

偏移量分支 2偏移量

分支 N偏移量

数据段

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

24/24

跳转表 2:由若干无条件转移指令组成跳转表 2表内由若干无条件转移指令( JMP BRAN1 、 JMP BRAN2 、 ... )组成,表存放在代码段中。(假设 :每条无条件转移指令都是 3个字节长度 )查找第 N个分支在的跳转表中的地址:(N- 1) * 3+表首址  

表首址

代码段

JMP 分支1

JMP 分支2

JMP 分支 N