(9)轉移指令程序員
轉移指令是彙編語言程序員常常使用的一組指令。在高級語言中,時常有「儘可能不要使用轉移語句」的勸告,但若是在彙編語言的程序中也儘可能不用轉移語句,那麼該程序要麼沒法編寫,要麼沒有多少功能,因此,在彙編語言中,不但要使用轉移指令,並且還要靈活運用,由於指令系統中有大量的轉移指令。編程
轉移指令分無條件轉移指令和有條件轉移指令兩大類。指針
1、無條件轉移指令(Transfer Unconditionally)blog
無條件轉移指令包括:JMP、子程序的調用和返回指令、中斷的調用和返回指令等。ip
下面只介紹無條件轉移指令JMP(Unconditional Jump)。ci
JMP指令的通常形式:get
JMP 標號/Reg/Memit
JMP指令是從程序當前執行的地方無條件轉移到另外一個地方執行。這種轉移能夠是一個短(short)轉移(偏移量在[-128, 127]範圍內),近(near)轉移(偏移量在[-32K, 32K]範圍內)或遠(far)轉移(在不一樣的代碼段之間轉移)。io
短和近轉移是段內轉移,JMP指令只把目標指令位置的偏移量賦值指令指針寄存器IP,從而實現轉移功能。但遠轉移是段間轉移,JMP指令不只會改變指令指針寄存器IP的值,並且還會改變代碼段寄存器CS的值。變量
該轉移指令的執行不影響任何標誌位。
例如:
…
next1: …
JMP next1 ;向前轉移,偏移量之差爲負數
…
JMP next2 ;向後轉移,偏移量之差爲正數
…
next2: …
在目前流行的彙編系統中,當段內轉移時,有些軟件把該轉移指令默認爲近轉移,從而使指令的偏移量用一個字來表示,因而生成3個字節的指令代碼,但若是程序員本身清楚轉移的幅度在一個短轉移的範圍以內,那麼,可用前置short的辦法來告訴彙編程序,讓它產生2個字節的指令代碼。
好比:若是程序員知道在上例中的標號next2離「JMP next2」指令的偏移量不會超過127,那麼,可用下面的轉移方式來省掉一個字節的指令代碼。
next2: …
JMP short next2 ;生成2個字節的轉移指令,從而節省一個字節
…
…
2、條件轉移指令(Transfer Conditionally)
條件轉移指令是一組極其重要的轉移指令,它根據標誌寄存器中的一個(或多個)標誌位來決定是否須要轉移,這就爲實現多功能程序提供了必要的手段。微機的指令系統提供了豐富的條件轉移指令來知足各類不一樣的轉移須要,在編程序時,要對它們靈活運用。
條件轉移指令又分三大類:基於無符號數的條件轉移指令、基於有符號數的條件轉移指令和基於特殊算術標誌位的條件轉移指令。
(a) 無符號數的條件轉移指令(Jumps Based on Unsigned (Logic) Data)
(b) 有符號數的條件轉移指令(Jumps Based on Signed (Arithmetic) Data)
(c) 特殊算術標誌位的條件轉移指令(Jumps Based on Special Arithmetic Tests)
例5.15 編寫一程序段,它把寄存器AX-BX的絕對值存入BX中。
解:
…
SUB BX, AX
JNS next
NEG BX
next: …
例5.16 已知一個字節變量char,試編寫一程序段,把其所存的大寫字母變成小寫字母。
解:
…
char DB 'F' ;變量說明
…
MOV AL, char
CMP AL, 'A'
JB next ;注意:字符是無符號數,不要使用指令JL
CMP AL, 'Z'
JA next
ADD char, 20H ;小寫字母比大寫字母的ASCII碼大20H
next: …
若是不知道(或忘了)大小寫字母ASCII碼之間的關係,那麼,可用數值表達式'a'-'A'、'b'-'B'、…、'z'-'Z'等來代替具體的數值20H。
例5.17 編寫一段程序,完成下面計算公式,其中:變量X和Y都是字類型。
解:
…
X DW ? ;變量說明
Y DW ?
…
MOV AX, X
MOV BX, AX ;用BX來臨時存放計算結果
CMP AX, 0
JLE setdata
CMP AX, 500
JG case3
ADD BX, 100D ;BX=X+100
JMP setdata
next: SUB BX, 50D ;BX=X-50
setdata: MOV Y, BX ;把計算結果賦給變量Y
…
例5.18 下面循環體的指令代碼字節數超過128,試改寫該循環。
…
MOV CX, COUNT ;給循環計數器賦初值(>0)
again: 循環體指令序列 ;循環體的首地址偏移量大於128
LOOP again
解:
…
MOV CX, COUNT
again: 循環體指令序列
DEC CX
JNZ again ;把LOOP指令改成條件轉移指令