?? 分支.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 + -