IA 32組合語言筆記(8) 分支程式設計

2021-09-28 18:44:26 字數 2631 閱讀 6734

(2)無條件和條件轉移指令

(3)多分支的實現

//大寫字母轉小寫

intcf315

(int ch)

//子過程cf315

//入口引數:堆疊傳遞ch

//出口引數:eax

_asm

_asm

//把十進位制數m轉十六進製制字元的ascii碼

intcf316

(int m)

_asm

_asm

int

cf317

(int m)

//開優化反彙編

_asm

轉移

屬於段內還是段間

條件轉移

段內迴圈指令

段內無條件轉移

段內或段間

過程呼叫和返回

段內或段間

軟中斷指令

段間中斷返回指令

段間無條件段內直接轉移無條件段內直接轉移指令的機器碼格式

操作碼op:轉移指令的機器碼

rel會被彙編器自動計算,並自動選取為8/16/32位來表示。如果只用了8位,就稱為短(short)轉移

如果程式不能自動計算位址偏差了多少,用32位來表示rel

如果程式設計時可以判斷位址偏差不超過8位範圍,可以用short指令強制彙編器用8位表示rel

由於rel是有符號數,轉移方向可以向前也可以向後

執行無條件段內轉移指令時,把指令中的位址差rel加到指令指標暫存器eip上,使eip之內容為轉移目標位址偏移,從而實現轉移。

名稱jmp(無條件段內直接轉移指令)

格式jmp label

動作下一條指令轉移到 label 處執行

無條件段內間接轉移

名稱jmp(無條件段內間接轉移指令)

格式jmp opdr

動作指令使控制無條件地轉移到由運算元oprd的內容給定的目標位址處

合法值opdr:32位暫存器、32位儲存單元

注意oprd內容直接被裝入指令指標暫存器eip,從而實現轉移

之前的文章已經寫過,見jcc相關部分:ia-32組合語言筆記(5)—— 控制轉移 & 堆疊

條件轉移指令通過判斷狀態標誌確定轉移是否發生,但是本身不影響標誌狀態

也是通過label標記確定轉移位置,在機器碼層面的實現和無條件段內直接轉移一樣

//示例函式cf319

intcf319

(int x,

int operation)

if(y >

1000

) y =

1000

;return y;

}

//返彙編(速度最大化)

push ebp

mov ebp, esp

;switch

( operation )

ln7cf319:;if

( y >

1000

) cmp eax,

1000

jle short ln1cf319

; y =

1000

; mov eax,

1000

ln1cf319:

;return y;

pop ebp ;撤銷堆疊框架

ret;

ln12cf319:

;多向分支目標位址表

dd ln6cf319 ;

case

1(dd代表雙字,每4個位元組存放乙個入口位址)

dd ln5cf319 ;

case

2 dd ln2cf319 ;

default

dd ln4cf319 ;

case

4 dd ln4cf319 ;

case

5 dd ln2cf319 ;

default

dd ln2cf319 ;

default

dd ln3cf319 ;

case

8

IA 32組合語言筆記(1) 基礎知識

二 組合語言的概念 三 資料的表示 儲存 目標 目標程式 由機器指令組成的程式 程式編譯過程 執行機器指令 暫存少量資料 訪問儲存器 由cpu直接識別並執行的指令稱為機器指令,採用二進位制編碼一般由操作碼和運算元兩部分構成 1 操作碼指出要進行的操作 運算 2 運算元指出參與操作的物件 結果存放位置...

彙編速查 IA32暫存器組織

暫存器 描述通用暫存器 8個32位,儲存正在處理的資料 段暫存器 6個16位,處理記憶體訪問 指令指標暫存器 1個32位,指向要執行的下一條指令碼 浮點資料暫存器 8個80位,浮點資料 控制暫存器 5個32位,確定處理器的操作模式 除錯暫存器 8個32位,在除錯處理器時包含資訊 暫存器描述 eax用...

組合語言 手記8

棧有兩個基本的操作 入棧和出棧 入棧 將乙個新的元素放到棧頂 出棧 從棧頂取出乙個元素 棧頂的元素總是最 棧,需要出棧時,又最先被從棧中取出。棧的操作規則 lifo 8086cpu提供相關的指令來以棧的方式訪問記憶體空間。入棧出棧指令 push 入棧 pop 出棧 push ax 將暫存器ax中的資...