1.轉移指令的原理
可以修改ip,或者同時修改cs和ip的指令統稱為轉移指令。
概括地講,轉移指令就是可以控制cpu執行記憶體中某處的**的指令。
8086cpu的轉移行為有以下幾類:
(1.1)只修改ip時,稱為段內轉移,比如:jmp ax
(1.2)同時修改cs和ip時,稱為段間轉移,比如: jmp 1000:0
由於轉移指令對ip的修改範圍不同,段內轉移又分為:短轉移和近轉移。
(1.3)短轉移ip的修改範圍為-128~127
(1.4)近轉移ip的修改範圍為-32768~32767
8086cpu的轉移指令分為以下幾類:
(1.5)無條件轉移指令(如: jmp)
(1.6)條件轉移指令(如:jnz)
(1.7)迴圈指令(如:loop)
(1.8)過程
(1.9)中斷
這些轉移指令轉移的前提條件可能不同,但轉移的基本原理是相同的。在這裡主要通過深入學習無條件轉移指令jmp來理解cpu執行轉移指令的基本原理。
2.偽指令offset操作符
assume cs:codesg
codesg segment
start: mov ax, offset start ;相當於mov ax, 0
s: mov ax, offset s ;相當於mov ax, 3
codesg ends
end start
mov ax, offset start 相當於指令 mov ax, 0,因為start是**段中的標號,它所標記的指令是**段中的第一條指令,偏移位址為0;
mov ax, offset s 相當於指令mov ax, 3,因為s是**段中的標號,它所標記的指令是**段中的第二條指令,第一條指令長度為3位元組,則s的偏移位址為3。
3.jmp指令
jmp為無條件轉移指令,可以只修改ip,也可以同時修改cs和ip。
jmp指令要給出兩種資訊:
3.1 轉移的目的位址
3.2 轉移的距離(段間轉移、段內短轉移、段內近轉移)
不同的給出目的位址的方法,和不同的轉移位置,對應有不同格式的jmp指令。
4.依據位移進行轉移的jmp指令
jmp short 標號**移到標號處執行指令)
這種格式的jmp指令實現的是段內短轉移,它對ip的修改範圍為-128~127,也就是說,它向前轉移時最多可以越過128個位元組,身後轉移時最多可以越過127個位元組。jmp指令中的'short'符號,說明指令進行的是短轉移。jmp指令中的'標號'是**段中的標號,指明了指令要轉移的目的地,轉移指令結束後,cs:ip應該指向標號處的指令。
例如:
assume cs:codesg
codesg segment
start: mov ax, 0
jmp short s
add ax, 1
s: inc ax
codesg ends
end start
上面的程式執行後,ax中的值為1,因為執行jmp short s 後,越過了add ax, 1,ip指向了標號s處的inc ax。也就是說,程式只進行了一次ax加1操作。
cpu在執行jmp指令的時候並不需要轉移的目的位址,只需要轉移的位移。
在'jmp short 標號' 指令所對應的機器碼中,並不包含轉移的目的位址,而包含的是轉移的位移。這個位移,是編譯器根據彙編指令中的'標號'計算出來的。
實際上,指令'jmp short 標號'的功能為:(ip)=(ip)+8位位移。
(1)8位位移='標號'處的位址 - jmp指令後的第乙個位元組的位址;
(2)short指明此處的位移為8位位移,進行的是段內短轉移;
(3)8位位移的範圍為-128~127,用補碼表示;
(4)8位位移由編譯程式在編譯時計算出來。
還有一種和指令'jmp short 標號'功能相近的指令格式:'jmp near ptr 標號',它實現的是段內近轉移。
指令'jmp near ptr 標號'的功能為:(ip)=(ip)+16位位移。
(1)16位位移='標號'處的位址 - jmp指令後的第乙個位元組的位址;
(2)near ptr指明此處的位移為16位位移,進行的是段內近轉移;
(3)16位位移的範圍為-32768~32767,用補碼表示;
(4)16位位移由編譯程式在編譯時計算出來。
有錯誤請指正,謝謝!
彙編學習記錄之六
1.源程式例子 assume cs codesg codesg segment start mov ax,0123h mov bx,0456h add ax,bx add ax,ax mov ax,4c00h int 21h codesg ends end start在組合語言源程式中,包含兩種指令...
彙編學習記錄之八
1.機器指令處理的資料所在位置 絕大部分機器指令都是進行資料處理的指令,處理大致可以分為三類 讀取 寫入 運算。在機器指令這一層來講,並不關心資料的值是多少,而關心指令執行前一刻,它將要處理的資料的所在位置。指令執行前,所要處理的資料可以在三個地方 cpu內部 記憶體 埠。2.組合語言中資料位置的表...
彙編學習記錄
加粗樣式今天看到了驅動開發教程裡的中斷這一章了,結果課本直接先來一段組合語言,然而我早已把彙編忘得一乾二淨了,無奈只能重新再學一下了 cpsr是記錄當前的工作模式的狀態暫存器,在超級使用者模式下,可以用如下指令改變當前使用者模式 mov r3 0xd3 不能直接用立即數直接對cpsr暫存器賦值,必須...