Please enable JavaScript.
Coggle requires JavaScript to display documents.
ch5 (Stack Operations (相關指令 (PUSHFD、POPFD : push跟pop EFLAGS暫存器, PUSHAD :…
ch5
Stack Operations
Runtime Stack (32-Bit Mode)
LIFO (Last-In, First-Out) structure
使用
ESP
(extended stack pointer)暫存器
堆疊的成長方向由
高
記憶體位置往
低
記憶體位置
PUSH 與 POP
PUSH
stack pointer -4 (32bits) 16bit就-2
將value複製到stack pointer所指向的位址
stack是向下堆疊的
POP
把ESP中的值存進暫存器或變數中
ESP+n (n = 2,4 看是16或32bits)
可以PUSH imm,但不能POP imm
相關指令
PUSHFD、POPFD : push跟pop EFLAGS暫存器
PUSHAD : 把所有32bits的一般暫存器全部push到stack中
POPAD : pops all the same registers off the stack in reverse order
PUSHA、POPA : 16bits的PUSHAD、POPAD
其他
為何在將字元push進stack時一定要先放入EAX中? 因為只有WORD跟DWORD可以被push進stack
PUSH跟POP指令應該以相反的順序出現
stack應用
暫存器的暫時存放區塊
使用CALL function時,儲存當前的子程序的返回位址
將輸入值(參數)傳入被呼叫的子程序當中
暫時存放子程序中的local variable
Defining and Using Procedures
Procedure
說明
就像是C++中的function
使用
PROC
以及ENDP來宣告
procedure必須要有一個名字
而除了main以外的procedure都要加ret
JMP不能跳到procedure的外面,除非是全域lable(::)
Procedure的文件
目的:描述procedure的功用
Receives : 說明需要使用到那些的input參數 (ex : eax, ebx),以及他們的使用方式
Returns : 描述procedure回傳什麼樣的值
Requires : 使用該procedure的前置條件(optional) ,如果沒有符合前置條件,那麼將可能輸出不正確的結果
CALL and RET 指令
CALL
用途 : 呼叫procedure
步驟
(1)把下一步要執行的指令的位址push到stack當中
(2)把要呼叫的procedure的位址儲存到EIP當中
RET
用途 : 把stack的top pop掉後,將ESP放入EIP中
Passing Register Arguments to
USES Operator
列出要被保存的暫存器
呼叫procesure時會自動將之push,結束procedure時再將之pop。->原值不改變
Linking to an External Library
Library
一個含有已被編譯成機器語言的procedure的檔案
由一個或多個OBJ檔案所構成
64-Bit Assembly Programming
The Irvine32 Library