第五章 循环与分支程序设计
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
20
0 1 2 3 4 5 6 7 8 9 10 11 12
12 11 22 33 44 55 66 77 88 99 111 222 333
di 12 6 10
si 12 6 4
(si)=0ah (di)=0ah Cf=0
(ax)=55
di 12 18 14 16
si 12 6 4 2
(si)=2 (di)=10h Cf=1
22
……
cmp je 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
Βιβλιοθήκη Baidu
(ax)=90
21
例:根据 AL 寄存器中哪一位为 1(从低位到高位), (从低位到高位) 把程序转移到 8 个不同的程序分支 branch_table dw dw dw dw dw dw dw dw routine1 routine1 routine2 routine2 routine3 routine3 routine4 routine4 routine5 routine5 routine6 routine6 routine7 routine7 routine8 routine8
100 99 78 30 66 45 189 256 15 -1
100 99 78 66 45 189 256 30 15 -1
100 99 78 66 189 256 45 30 15 -1
100 99 78 189 256 66 45 30 15 -1
100 99 189 256 78 66 45 30 15 -1
low_idx 1 1 4 5
high_idx 12 5 5 5
(ax)=55
(si)=0ah Cf=0
low_idx 1 7 7 8 9
high_idx 12 12 8 8 8
(ax)=90
(si)=10h Cf=1
19
算法2 算法2 search:
mov si, [di] even_idx: test si, 1 jz add_idx inc si add_idx: add di, si compare: cmp ax, [di] je all_done ja higher cmp si, 2 jne idx_ok no_match: stc jmp exit
;逻辑右移 ;jnb=jnc ;段内间接转移
si, type branch_table L
24
…… cmp je lea mov mov L: shl jnb jmp sub1: sub loop continue: …… routine1: …… routine2: ……
(基址变址寻址) 基址变址寻址)
; ’0’~’9’ ASCII 30H~39H
; ’A’~’F’ ASCII 41H~46H
7
例:从键盘接收十进制数并存入 BX
…… mov newchar: mov int sub jl cmp jg cbw xchg mov mul xchg add jmp …… bx, 0 ah, 1 21h al, al, 30h exit al, 9 exit
loop1: loop1: loop2: loop2:
…… mov dec mov mov mov cmp jge xchg mov
cx, 10 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
; 向前引用
15
例:折半查找算法 data segment
array dw 12,11,22,33,44,55,66, 12,11,22,33,44,55,66, 77,88,99,111,222,333 number low_idx high_idx dw dw dw 55 ? ?
data
ends
; (ax)=第一个元素,找到退出 ; (ax)<第一个元素,未找到退出
; (ax)与最后一个元素比较 ; (ax)=最后一个元素,找到退出 ; (ax)>最后一个元素,未找到退出
17
search:
mov mov mov mov mid: mov mov cmp ja add shr mov shl low_idx, 1 bx, [di] high_idx, bx bx, di cx, low_idx dx, high_idx cx, dx no_match cx, dx cx, 1 si, cx si, 1 compare: cmp ax, [bx+si] je exit ja higher
idx_ok: shr si, 1 test si, 1 jz sub_idx inc si sub_idx: sub di, si jmp short compare higher: cmp si, 2 je no_match shr si, 1 jmp short even_idx all_done: mov si, di exit: ……
…… mov rotate: mov rol mov and add cmp jl add printit: mov mov int dec jnz …… ch, 4 cl, cl, 4 bx, cl al, bl al, 0fh al, 30h al, 3ah printit al, 7h dl, al ah, 2 21h ch rotate
第五章
循环与分支程序设计
• •
循环程序设计 分支程序设计
1
编制汇编语言程序的步骤: 编制汇编语言程序的步骤: (1) 分析题意,确定算法 (2) 根据算法画出程序框图 (3) 根据框图编写程序 (4) 上机调试程序
2
程序结构: 程序结构:
顺序结构 循环结构
分支结构
子程序结构
…
复合结构: 复合结构:多种程序结构的组合
x →
array_head→
…… mov ax, n array_headmov array_head-2, 0ffffh mov si, 0 compare: cmp jle mov mov sub jmp insert: array_end[si+2], mov array_end[si+2], ax …… array_end[si], array_end[si], ax insert bx, array_end[si] array_end[si+2], array_end[si+2], bx si, 2 short compare
23
…… cmp je mov L: shr jnb jmp add1: add jmp continue: …… routine1: …… routine2: ……
(寄存器相对寻址) 寄存器相对寻址)
al, 0 continue si, 0 al, 1 add1 branch_table[si]
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) 地址跳跃表(值与地址有对应关系的表) 地址跳跃表(值与地址有对应关系的表)
16
算法1 算法1
…… lea mov
di, array ax, number ax, [di+2] chk_last si, [di+2] exit exit si, [di] si, 1 si, di ax, [si] search exit exit
; (ax)与第一个元素比较
cmp ja lea je stc jmp chk_last: mov shl add cmp jb je stc jmp
<0退出 ; <0退出 ; >9退出 >9退出
ax, cx, cx ax, bx,
bx 10 bx ax
newchar
8
exit:
例:从键盘接收十六进制数并存入 BX
…… mov newchar: mov int sub jl cmp jl sub cmp jl cmp jge add_to: add_to: mov shl mov add jmp exit: …… bx, 0 ah, 1 21h al, 30h exit al, 10 add_to al, 27h al, 0ah exit al, 10h exit cl, 4 bx, cl ah, 0 bx, ax newchar
-1 3 5 15 23 37 49 52 65 78
array_end→
99 105 32
n →
10
例:将首地址为 a 的字数组从大到小排序 起泡排序算法, (起泡排序算法,多重循环)
100 30 78 99 15 -1 66 45 189 256
100 78 99 30 15 66 45 189 256 -1
…… mov mov mov next: mov shr jc add jmp subtract: sub result: mov add loop ……
bx, 0 cx, 10 dx, logic_rule ax, x[bx] dx, 1 subtract ax, y[bx] short result ax, y[bx] z[bx], ax bx, 2 next
3
1. 循环程序设计
初始化
初始化
N N
控制条件
Y
循环体 控制条件
Y
循环体
DO-WHILE 结构
DO-UNTIL 结构
4
初始化:设置循环的初始状态 循环体:循环的工作部分及修改部分 控制条件:计数控制
特征值控制 地址边界控制
5
例:把 BX 中的二进制数以十六进制的形式显示在屏幕上
BX
1
2 3
4
6
<0退出 ; <0退出
; ‘a’~‘f’ <‘a’退出 ; <‘a’退出 >’f’退出 ; >’f’退出
9
例:将正数 n 插入一个已整序的正数字数组
x dw array_head dw array_end dw n dw ? 15,23,37,49,52,65,78, 3,5,15,23,37,49,52,65,78,99 105 32
100 189 256 99 78 66 45 30 15 -1
189 256 100 99 78 66 45 30 15 -1
256 189 100 99 78 66 45 30 15 -1
11
a
dw
100,30,78,99,15,100,30,78,99,15,-1,66,45,189,256
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
逻辑尺: 逻辑尺:0 0 1 1 0 1 1 1 0 0
1 0 减法 加法
z10= x10 + y10
14
x y z logic_rule
dw dw dw dw
x1,x2,x3,x4,x5,x6,x7,x8,x9,x10 y1,y2,y3,y4,y5,y6,y7,y8,y9,y10 z1,z2,z3,z4,z5,z6,z7,z8,z9,z10 00dch
dec mov jmp
higher:
cx high_idx, cx mid cx low_idx, cx mid
inc mov jmp
no_match: stc exit: ……
18
0 1 2 3 4 5 6 7 8 9 10 11 12
12 11 22 33 44 55 66 77 88 99 111 222 333
al, 0 continue bx, branch_table si, 7 * type branch_table cx, 8 ;逻辑左移 al, 1 逻辑左移 ;jnb=jnc sub1 ;段内间接转移 word ptr [bx][si] si, type branch_table L
0 1 2 3 4 5 6 7 8 9 10 11 12
12 11 22 33 44 55 66 77 88 99 111 222 333
di 12 6 10
si 12 6 4
(si)=0ah (di)=0ah Cf=0
(ax)=55
di 12 18 14 16
si 12 6 4 2
(si)=2 (di)=10h Cf=1
22
……
cmp je 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
Βιβλιοθήκη Baidu
(ax)=90
21
例:根据 AL 寄存器中哪一位为 1(从低位到高位), (从低位到高位) 把程序转移到 8 个不同的程序分支 branch_table dw dw dw dw dw dw dw dw routine1 routine1 routine2 routine2 routine3 routine3 routine4 routine4 routine5 routine5 routine6 routine6 routine7 routine7 routine8 routine8
100 99 78 30 66 45 189 256 15 -1
100 99 78 66 45 189 256 30 15 -1
100 99 78 66 189 256 45 30 15 -1
100 99 78 189 256 66 45 30 15 -1
100 99 189 256 78 66 45 30 15 -1
low_idx 1 1 4 5
high_idx 12 5 5 5
(ax)=55
(si)=0ah Cf=0
low_idx 1 7 7 8 9
high_idx 12 12 8 8 8
(ax)=90
(si)=10h Cf=1
19
算法2 算法2 search:
mov si, [di] even_idx: test si, 1 jz add_idx inc si add_idx: add di, si compare: cmp ax, [di] je all_done ja higher cmp si, 2 jne idx_ok no_match: stc jmp exit
;逻辑右移 ;jnb=jnc ;段内间接转移
si, type branch_table L
24
…… cmp je lea mov mov L: shl jnb jmp sub1: sub loop continue: …… routine1: …… routine2: ……
(基址变址寻址) 基址变址寻址)
; ’0’~’9’ ASCII 30H~39H
; ’A’~’F’ ASCII 41H~46H
7
例:从键盘接收十进制数并存入 BX
…… mov newchar: mov int sub jl cmp jg cbw xchg mov mul xchg add jmp …… bx, 0 ah, 1 21h al, al, 30h exit al, 9 exit
loop1: loop1: loop2: loop2:
…… mov dec mov mov mov cmp jge xchg mov
cx, 10 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
; 向前引用
15
例:折半查找算法 data segment
array dw 12,11,22,33,44,55,66, 12,11,22,33,44,55,66, 77,88,99,111,222,333 number low_idx high_idx dw dw dw 55 ? ?
data
ends
; (ax)=第一个元素,找到退出 ; (ax)<第一个元素,未找到退出
; (ax)与最后一个元素比较 ; (ax)=最后一个元素,找到退出 ; (ax)>最后一个元素,未找到退出
17
search:
mov mov mov mov mid: mov mov cmp ja add shr mov shl low_idx, 1 bx, [di] high_idx, bx bx, di cx, low_idx dx, high_idx cx, dx no_match cx, dx cx, 1 si, cx si, 1 compare: cmp ax, [bx+si] je exit ja higher
idx_ok: shr si, 1 test si, 1 jz sub_idx inc si sub_idx: sub di, si jmp short compare higher: cmp si, 2 je no_match shr si, 1 jmp short even_idx all_done: mov si, di exit: ……
…… mov rotate: mov rol mov and add cmp jl add printit: mov mov int dec jnz …… ch, 4 cl, cl, 4 bx, cl al, bl al, 0fh al, 30h al, 3ah printit al, 7h dl, al ah, 2 21h ch rotate
第五章
循环与分支程序设计
• •
循环程序设计 分支程序设计
1
编制汇编语言程序的步骤: 编制汇编语言程序的步骤: (1) 分析题意,确定算法 (2) 根据算法画出程序框图 (3) 根据框图编写程序 (4) 上机调试程序
2
程序结构: 程序结构:
顺序结构 循环结构
分支结构
子程序结构
…
复合结构: 复合结构:多种程序结构的组合
x →
array_head→
…… mov ax, n array_headmov array_head-2, 0ffffh mov si, 0 compare: cmp jle mov mov sub jmp insert: array_end[si+2], mov array_end[si+2], ax …… array_end[si], array_end[si], ax insert bx, array_end[si] array_end[si+2], array_end[si+2], bx si, 2 short compare
23
…… cmp je mov L: shr jnb jmp add1: add jmp continue: …… routine1: …… routine2: ……
(寄存器相对寻址) 寄存器相对寻址)
al, 0 continue si, 0 al, 1 add1 branch_table[si]
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) 地址跳跃表(值与地址有对应关系的表) 地址跳跃表(值与地址有对应关系的表)
16
算法1 算法1
…… lea mov
di, array ax, number ax, [di+2] chk_last si, [di+2] exit exit si, [di] si, 1 si, di ax, [si] search exit exit
; (ax)与第一个元素比较
cmp ja lea je stc jmp chk_last: mov shl add cmp jb je stc jmp
<0退出 ; <0退出 ; >9退出 >9退出
ax, cx, cx ax, bx,
bx 10 bx ax
newchar
8
exit:
例:从键盘接收十六进制数并存入 BX
…… mov newchar: mov int sub jl cmp jl sub cmp jl cmp jge add_to: add_to: mov shl mov add jmp exit: …… bx, 0 ah, 1 21h al, 30h exit al, 10 add_to al, 27h al, 0ah exit al, 10h exit cl, 4 bx, cl ah, 0 bx, ax newchar
-1 3 5 15 23 37 49 52 65 78
array_end→
99 105 32
n →
10
例:将首地址为 a 的字数组从大到小排序 起泡排序算法, (起泡排序算法,多重循环)
100 30 78 99 15 -1 66 45 189 256
100 78 99 30 15 66 45 189 256 -1
…… mov mov mov next: mov shr jc add jmp subtract: sub result: mov add loop ……
bx, 0 cx, 10 dx, logic_rule ax, x[bx] dx, 1 subtract ax, y[bx] short result ax, y[bx] z[bx], ax bx, 2 next
3
1. 循环程序设计
初始化
初始化
N N
控制条件
Y
循环体 控制条件
Y
循环体
DO-WHILE 结构
DO-UNTIL 结构
4
初始化:设置循环的初始状态 循环体:循环的工作部分及修改部分 控制条件:计数控制
特征值控制 地址边界控制
5
例:把 BX 中的二进制数以十六进制的形式显示在屏幕上
BX
1
2 3
4
6
<0退出 ; <0退出
; ‘a’~‘f’ <‘a’退出 ; <‘a’退出 >’f’退出 ; >’f’退出
9
例:将正数 n 插入一个已整序的正数字数组
x dw array_head dw array_end dw n dw ? 15,23,37,49,52,65,78, 3,5,15,23,37,49,52,65,78,99 105 32
100 189 256 99 78 66 45 30 15 -1
189 256 100 99 78 66 45 30 15 -1
256 189 100 99 78 66 45 30 15 -1
11
a
dw
100,30,78,99,15,100,30,78,99,15,-1,66,45,189,256
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
逻辑尺: 逻辑尺:0 0 1 1 0 1 1 1 0 0
1 0 减法 加法
z10= x10 + y10
14
x y z logic_rule
dw dw dw dw
x1,x2,x3,x4,x5,x6,x7,x8,x9,x10 y1,y2,y3,y4,y5,y6,y7,y8,y9,y10 z1,z2,z3,z4,z5,z6,z7,z8,z9,z10 00dch
dec mov jmp
higher:
cx high_idx, cx mid cx low_idx, cx mid
inc mov jmp
no_match: stc exit: ……
18
0 1 2 3 4 5 6 7 8 9 10 11 12
12 11 22 33 44 55 66 77 88 99 111 222 333
al, 0 continue bx, branch_table si, 7 * type branch_table cx, 8 ;逻辑左移 al, 1 逻辑左移 ;jnb=jnc sub1 ;段内间接转移 word ptr [bx][si] si, type branch_table L