
第四章 汇编语言程序设计基础 基本程序结构: 顺序结构 循环结构 分支结构 子程序结构 复合结构:多种程序结构的组合 1
1 第四章 汇编语言程序设计基础 基本程序结构: 顺序结构 循环结构 分支结构 子程序结构 复合结构:多种程序结构的组合 ……

4.1循环程序设计 初始化 循环的初始状态 循环体 循环的工作部分及修改部分 修改部分 计数控制 循环控制 特征值控制 条件 地址边界控制 结束 2
2 4.1 循环程序设计 结 束 初始化 循环的初始状态 循 环 体 循环的工作部分及修改部分 计数控制 特征值控制 地址边界控制 修改部分 循环控制 条件 Y N

例1.把BX中的二进制数以十六进制的形式显示在屏幕上。 BX 4 3
3 例1. 把BX中的二进制数以十六进制的形式显示在屏幕上。 BX 1 2 3 4

mov ch,4 rotate: mov cl, 4 rol bx,cl mov al,bl and al,Ofh add al,30h ;'0'-'9'ASCII30H-39H cmp al,3ah jl printit add al, 7h 'A'-'F'ASCII 41H-46H printit: mov dI, al mov ah, 2 int 21h dec ch jnz rotate 4
4 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 add al, 7h ; ’A’-’F’ ASCII 41H-46H printit: mov dl, al mov ah, 2 int 21h dec ch jnz rotate

例2.将正数插入一个已整序的字数组的正确位置。 算法:将数组中数逐个与N比较,Si为指针 若N<Ki,则Ki下移一个单元 若N≥Ki,则插在Ki的下一个单元,并结束 临界条件: 若N≥Kn,则插入Kn的下一个单元 若N<K1,则KI~Kn后移一个单元,N插在第一个单元 循环控制: 计数控制 元素个数=((字末地址一字首地址)/2)+1 字数 =(字节末地址一字节首地址)+1 字节数 地址边界控制 结束地址为ARRAY HEAD ■特征值控制:表示结束条件的值
5 例2. 将正数n插入一个已整序的字数组的正确位置。 算法: 将数组中数逐个与N比较,Si为指针 若N<Ki,则Ki下移一个单元 若NKi,则插在Ki的下一个单元,并结束 临界条件: 若NKn,则插入Kn的下一个单元 若N<K1,则K1~Kn后移一个单元, N插在第一个单元 循环控制: ▪计数控制 元素个数=((字末地址-字首地址) / 2) +1 字数 = (字节末地址-字节首地址) +1 字节数 ▪地址边界控制 结束地址为ARRAY_HEAD ▪特征值控制: 表示结束条件的值

例2.将正数插入一个已整序的字数组的正确位置。 X dw? array_head dw 3,5,15,23,37,49,52,65,78,99 array_end dw 105 n dw 32 -1 3 mov ax,n 5 mov array_head-2,Offffh 15 mov si,0 23 compare: 37 cmp array_end[si],ax 49 jle insert 52 mov bx,array_end[si] 65 array_end[si+2],bx 78 mov 99 sub si,2 105 jmp short compare n 32 insert: mov array_end[si+2],ax 6
6 例2. 将正数n插入一个已整序的字数组的正确位置。 x dw ? array_head dw 3,5,15,23,37,49,52,65,78,99 array_end dw 105 n dw 32 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 -1 3 5 49 15 52 23 37 105 99 78 65 32 x n

例3将首地址为A的字数组从小到大排序(气泡算法,多重循环) A dw 3 32,85,16,15,8 比较遍数 序号 地址 数 1 2 3 4 1 A 32 32 16 15 8, 2 A+2 85 16 15 8 3 A+4 16 15 8 16 4 A+6 15 8 3 5 A+8 8 85 85 85 7
7 例3 将首地址为A的字数组从小到大排序(气泡算法,多重循环) A dw 32,85,16,15, 8 序号 地址 数 比 较 遍 数 1 2 3 4 1 A 32 2 A+2 85 3 A+4 16 4 A+6 15 5 A+8 8 32 16 15 8 85 16 15 8 32 85 15 8 16 32 85 8 15 16 32 85

mov cX,10 dec CX loop1: mov di,cx mov bx,0 -loop2: mov ax,A[bx] cmp ax,A[bx+2] jle continue xchg ax,A[bx+2] mov A[bx],ax continue: add bx,2 loop loop2 mov cx,di loop loopl 8
8 mov cx, 10 dec cx loop 1 : mov di, cx mov bx, 0 loop 2 : mov ax, A[bx] cmp ax, A[bx+ 2 ] jle continue xchg ax, A[bx+ 2 ] mov A[bx], ax continue : add bx, 2 loop loop 2 mov cx, di loop loop 1

4.2分支程序设计 判定条件 判定条件 A B A B X (1)两路分支结构 (2)多路分支结构 9
9 4.2 分支程序设计 判定条件 A B A B X 判定条件 … (1)两路分支结构 (2)多路分支结构

(1)逻辑尺控制 (2)条件控制 2 case 1 case 2 case n case 1 case 2 case 3 (3)地址跳跃表 TABLE DW ONE,TWO,THREE JMP TABLE[SI 00g 1000 ONE: 2000 TWO: 3000 THREE: 10
10 (1)逻辑尺控制 (2)条件控制 (3)地址跳跃表 TABLE DW ONE, TWO, THREE JMP TABLE[SI] … 1000 ONE: … 2000 TWO: … 3000 THREE: … ? ? case 1 case 2 case 3 case 1 case 2 case n