(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中的資...