⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 分支.txt

📁 会变语言实现的一些程序
💻 TXT
字号:
汇编分支程序设计学习笔记
         金州2005.11.15
说明,因为是学习笔记,可能有不正确的地方,只作参考,不可作为学习资料,
凡是文中金州注释的地方为个人注释,不一定正确
注意,逻辑尺控制,条件控制,地址跳跃表。 
case 结构,if_then_else结构
例如,有数组x(x1,x2,........x10)和数组y(yl,y2,.y10)
编程计算z(z1,z2,......z10)

x dw x1,x2,x3,x4,x5,x6,x7,x8,x9,x10
y dw y1,y2,y3,y4,y5,y6,y7,y8,y9,y10
z dw z1,z2,z3,z4,z5,z6,z7,z8,z9,z10
logic_rule dw oodch                (定义逻辑尺,金州注释)
........
mov bx, 0                          (以下程序主体,主要是循环结构,金州注释)
mov cx, 10
mov dx,  logic_rule 
next: mov ax, x[bx]
shr dx, 1
jc subtract                      
add ax, y[bx]              (加x1,y1 金州注释)
jmp short result
subtract:
sub ax, y[bx]
result: mov z[bx], ax        (赋予z,金州注释)
add bx, 2
loop next                      (进入循环)
.......


例如,折半查找算法,(意思是先和最小的比较,然后最大的比较,如果有就比较中间,然后再折半,比顺序查找效率高。) 
data segment
arry dw 12,11,22,33,44,55,66,77,88,99,111,222,333
number dw 55            (要找的数字,金州注释) 
low_idx dw ?
high_idx dw ?             
data ends
..........
lea di, array     (给di赋予地址,初值为0,金州注释)
mov ax, mumber     (number 赋予ax,即55,金州注释)

cmp ax, [di+2]     (ax与第一个元素比较,金州注释)
ja chk_last          (大于往下找,金州注释)
lea si, [di+2]      (si 等于2了,金州注释)
je exit            (相等退出来,金州注释)
stc
jmp exit 
chk_last:
mov si, [di]         (si初值变为12,金州注释)
shl si, 1           (逻辑左移,金州注释)
addd si, di    
cmp ax, [si] 
jb search           (<继续比较,金州注释)
je exit              (相等推出,金州注释)
stc
jmp exit          (比最大的还大,退出,金州注释)
search:
mov low_idx, 1
mov bx, [di]
mov high_idx, bx
mov bx, di
mid:
mov cx, low_idx
mov dx, high_idx
cmp cx, dx
ja no_match
add cx, dx
shr cx, 1        (向右移动,等于相加除2,金州注释) 
mov si, cx
shl si ,1
compare:
cmp ax, [bx+si]
je exit           (相等退出,金州注释)
ja higher           (否则转到高位,金州注释)
dec cx
mov high_idx, cx
jmp mid                (无条件转到mid,金州注释) 
higher:
inc cx
mov low_idx,cx
jmp mid
no_match:
stc
exit:

例如,根据AL寄存器中的哪一位为1(从低位到高位),
把程序转移到8个不同的程序分支

branch_table dw routine1
dw routine2
dw routine3
dw routine4
dw routine5
dw routine6
dw routine7
dw routine8
........
cmp al, 0        (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 L
continue:
.....
routine1:
........
routine2
.........

基址变址寻址
.......
cmp al,0
je continue
lea bx, branch_table
mov si, 7*type branch_table
mov cx, 8
jnb sub1
jmp word ptr[bx][si]
sub1: sub si, type branch_table
loop L
continue:
........
routine1:
..........
toutine2
...........

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -