可以修改ip,或同時修改cs和ip的指令統稱為轉移指令。
轉移行為有很多種不同的分類方法:
根據只修改ip和同時修改cs和ip,可以分為段內轉移(jmp ax)和段間轉移(jmp 1000:0)
根據指令對ip的修改範圍不同,段內轉移又分為短轉移(ip的修改範圍為-128-127)和近轉移(ip的修改範圍-32768-32767)
8086cpu的轉移指令分為以下幾類:
1、無條件轉移指令,如jmp
2、條件轉移指令
3、迴圈指令,如loop
4、過程
5、中斷
assume cs:codesg
codesg segment
start: mov ax,offset start
s: mov ax,offset s
codesg ends
end start
第三行語句中的offset start就相當於0,因為start標號的偏移位址為0;第四句中的offset s就相當於3,因為s標號的偏移位址為3,這是由於第一條指令長度為3個位元組。
s0: nop
nop
然後再將其他標號s處的指令直接複製過去:
mov si,offset s
mov di,offset s0
mov ax,cs:[si]
mov cs:[di],ax
使用格式:
jmp short 標號
它實現的是段內短轉移,對ip的修改範圍為-128-127,也就是說它向前轉移時最多可以越過128個位元組,向後轉移時可以最多越過127個位元組,轉移指令結束後,cs:ip應該指向標號處的指令。
值得注意的是,這個指令對應的機器碼中是沒有轉移的目的位址的,而是包含轉移的位移,編譯器根據兩點的距離計算出位移量,然後修改ip暫存器中的值,在編譯結束後的機器指令中就包含轉移位移了。相當於該指令的作用其實是(ip)=(ip)+8位位移。
對應的段內近轉移指令:
jmp near ptr 標號
他對ip的修改範圍為-32768-32767.相當於(ip)=(ip)+16位位移。
對應的遠轉移指令(段間轉移):
jmp far ptr 標號
這個指令對應的機器碼中就包含了轉移的目的位址了。
jmp可以直接加16位reg:
jmp 16位reg
它的意思就是修改ip暫存器的值,修改為對應暫存器中的值。
1、只修改ip的段內轉移:
jmp word ptr ds:[0]
相當於把對應位址的值賦值給ip暫存器,完成轉移。
2、同時修改ip和cs的段間轉移:
jmp dword ptr ds:[0]
從對應記憶體位址單元中取出兩個字,低位址的那個字賦值給ip,高位址的那個字賦值給cs,完成轉移。
jcxz為有條件轉移指令,所有的有條件轉移指令都是短轉移,在對應的機器碼中包含轉移的位移,而不是目的位址。對ip的修改都是-128-127.
使用格式:
jcxz 標號
相當於如果cx暫存器中的值是0,就執行:
jmp short 標號
loop指令是迴圈指令,所有的迴圈指令都是短轉移,基本使用用法:
loop 標號
相當於:
(cx)--
if((cx)!=0)jmp short 標號
在上述段內轉移指令中,我們可以發現這些指令對應的機器碼中只有轉移的相對位移,而不包含轉移的目的位址,這種設計是為了方便程式段在記憶體中的浮動裝配。
如果我們自定義的程式要直接引用某個寫好的目標檔案,這個檔案內部的轉移寫成段內轉移,這樣就可以保證在連線時不會出錯,不會因為該目的位址有其他內容而覆蓋。
此外還要注意位移超界的問題,如果轉移範圍出現超界,編譯器會報錯。
彙編 (七)轉移指令原理
轉移指令 可以修改ip或同時修改cs和ip的指令。概括講,就是可以控制cpu執行記憶體中某處 的指令。8086cpu轉移行為 根據轉移指令對ip的修改範圍不同,段內轉移分為 短轉移,ip修改範圍為 128 127 近轉移,ip修改範圍為 32768 32767 8086cpu轉移指令分為以下幾類 1...
9 轉移指令的原理
1 可以修改ip,或同時修改cs和ip的指令統稱為轉移指令。概括的講,轉移指令就是可以控制cpu執行記憶體中某處 的指令,8086cpu的轉移行為有兩種 1 只修改ip時,稱為段內轉移,比如 jmp ax 2 同時修改cs和ip時,稱為段間轉移,比如 jmp 1000 0 段內轉移又分為 1 短轉移...
9 轉移指令的原理
1.可以修改ip,或同時修改cs和ip的指令統稱轉移指令。概括地講,轉移指令就是可以控制cpu執行記憶體中某處 的指令。2.8086cpu的轉移行為有以下幾種 1 只修改ip時,稱為段內轉移。例如 jmp ax 2 同時修改cs和ip時,成為 段間轉移。例如 jmp 1000 0 3.由於轉移指令對...