這種程序的思路是先判斷條件是否成立;若成立,轉到轉移指令指定的位置執(zhí)行
例:從接口 03f 0h 中取數(shù),若此數(shù) >=90 ,則將 00h 送 03f 7h ,若此數(shù) <90 ,則將 ffh 送接口 03f 3h 。程序如下:
mov dx , 03f 0h
in al , dx
cmp al , 90
jnc next1
mov al , 0ffh
jmp next2
next1 :
mov al , 00h
next2 :
mov dx , 03f 7h
out dx , al
hlt
分支程序根據(jù)條件是真或假決定執(zhí)行與否
判斷的條件是各種指令,如 cmp 、 test 等執(zhí)行后形成的狀態(tài)標志
轉移指令 jcc 和 jmp 可以實現(xiàn)分支控制;還可以采用 masm 6.x 提供的條件控偽指令實現(xiàn)
單分支程序設計
條件成立跳轉,否則順序執(zhí)行分支語句體;注意選擇正確的條件轉移指令和轉移目標地址
cmp ax,0
jns nonneg
; 分支條件: ax ≥ 0
neg ax
; 條件不滿足,求補
nonneg: mov result,ax
; 條件滿足
例:計算 ax 的絕對值
雙分支程序設計
條件成立跳轉執(zhí)行第 2 個分支語句體,否則順序執(zhí)行第 1 個分支語句體。注意第 1 個分支體后一定要有一個 jmp 指令跳到第 2 個分支體后
例 : 顯示 bx 最高位
shl bx,1 ;bx 最高位移入 cf
jc one
;cf = 1 ,即最高位為 1 ,轉移
mov dl,' 0'
;cf = 0 ,即最高位為 0 , dl ←' 0 '
jmp two ; 一定要跳過另一個分支體
one: mov dl, ' 1 ' ;dl ←' 1 '
two: mov ah,2
int 21h ; 顯示
mov dl, ' 0 ' ;dl ←' 0 '
shl bx,1 ;bx 最高位移入 cf
jnc two
;cf = 0 ,最高位為 0 ,轉移
mov dl,' 1'
;cf = 1 ,最高位為 1 , dl ←' 1 '
two: mov ah,2
int 21h ; 顯示
例 : 顯示 bx 最高位
多分支程序設計
多個條件對應各自的分支語句體,哪個條件成立就轉入相應分支體執(zhí)行。多分支可以化解為雙分支或單分支結構的組合例如:
or ah,ah ; 等效于 cmp ah,0
jz function0 ;ah = 0 ,轉向 function0
dec ah ; 等效于 cmp ah,1
jz function1 ;ah = 1 ,轉向 function1
dec ah ; 等效于 cmp ah,2
jz function2 ;ah = 2 ,轉向 function2
ah=0
fuction0
y
n
ah=1
fuction1
y
n
ah=2
fuction2
y
n
地址表形成多分支
需要在數(shù)據(jù)段事先安排一個按順序排列的轉移地址表,輸入的數(shù)字作為偏移量。因為只有 2 個字節(jié) 16 位偏移地址,所以偏移量需要乘 2
關鍵是要理解間接尋址方式 jmp 指令
.data
msg db 'input number(1~8):',0dh,0ah,'$'
msg1 db 'chapter 1 : ...',0dh,0ah,'$'
msg2 db 'chapter 2 : ...',0dh,0ah,'$‘
...
msg8 db 'chapter 8 : ... ',0dh,0ah,'$'
table dw disp1,disp2,disp3,disp4
dw disp5,disp6,disp7,disp8
; 取得各個標號的偏移地址
例 : 數(shù)據(jù)段
start1: mov dx,offset msg ; 提示輸入數(shù)字
mov ah,9
int 21h
mov ah,1 ; 等待按鍵
int 21h
cmp al,'1' ; 數(shù)字 < 1 ?
jb start1
cmp al,'8' ; 數(shù)字 > 8 ?
ja start1
and ax,000fh ; 將 ascii 碼轉換成數(shù)字
dec ax
shl ax,1 ; 等效于 add ax,ax
mov bx,ax
jmp table[bx]
; (段內)間接轉移: ip ← [table+bx]
start2: mov ah,9
int 21h
.exit 0
disp1: mov dx,offset msg1 ; 處理程序 1
jmp start2
..