《分支程序設計》由會員分享,可在線閱讀,更多相關《分支程序設計(5頁珍藏版)》請在裝配圖網上搜索。
1、本文格式為Word版,下載可任意編輯
分支程序設計
這種程序的思路是先推斷條件是否成立;若成立,轉到轉移指令指定的位置執(zhí)行
例:從接口 03F 0H 中取數,若此數 =90 ,則將 00H 送 03F 7H ,若此數 90 ,則將 FFH 送接口 03F 3H 。程序如下:
MOV DX , 03F 0H
IN AL , DX
CMP AL , 90
JNC NEXT1
MOV AL , 0FFH
JMP NEXT2
NEX
2、T1 :
MOV AL , 00H
NEXT2 :
MOV DX , 03F 7H
OUT DX , AL
HLT
分支程序依據條件是真或假打算執(zhí)行與否
推斷的條件是各種指令,如 CMP 、 TEST 等執(zhí)行后形成的狀態(tài)標志
轉移指令 Jcc 和 JMP 可以實現分支掌握;還可以采納 MASM 6.x 供應的條件控偽指令實現
單分支程序設計
條件成立跳轉,否則挨次執(zhí)行分支語句體;留意選擇正確的條件轉移指令和轉移目標地址
cmp ax,0
jns nonneg
; 分支條件: AX ≥ 0
neg
3、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
4、←' 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 func
5、tion0 ;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
地址表形成多分支
需要在數據段事先支配一個按挨次排列的轉移地址表,輸入的數字作為偏移量。由于只有 2 個字節(jié) 16 位偏移地址,所以偏移量需要乘 2
關鍵是要理解間接尋址
6、方式 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
; 取得各個標號的偏移地址
例 : 數據段
start1: mov dx,offset msg ; 提示輸入
7、數字
mov ah,9
int 21h
mov ah,1 ; 等待按鍵
int 21h
cmp al,'1' ; 數字 1 ?
jb start1
cmp al,'8' ; 數字 8 ?
ja start1
and ax,000fh ; 將 ASCII 碼轉換成數字
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
..
第 5 頁 共 5 頁