1. 程式人生 > >讀書筆記_CALL和RET指令

讀書筆記_CALL和RET指令

 

   CALL指令是x86CPU中專門用作函式呼叫的指令,它的作用就是將當前的程式指標(EIP暫存器)值儲存到棧中(稱為linking information),然後轉移到(branch to)目標運算元所指定的函式(被呼叫過程)繼續執行。

   根據被呼叫過程是否位於同一個程式碼段,CALL呼叫被分為近呼叫(Near Call)和遠呼叫(Far Call)兩種。在近呼叫中CPU的操作如下:

A.      將EIP暫存器的當前值壓入到棧中供返回時使用

B.      將被呼叫過程的偏移(相對於當前段)載入到EIP暫存器中

C.      開始執行被呼叫過程

對於遠呼叫,CPU執行的操作如下:

A. 將CS暫存器的當前值壓入到棧中供返回時使用

B. 將EIP暫存器的當前值壓入到棧中返回時使用

C. 將包含被呼叫過程的程式碼段的段選擇子載入到CS暫存器

D. 被呼叫過程的偏移載入到EIP暫存器

E.  開始執行被呼叫過程

可以看出近呼叫和遠呼叫的差異在於是否處理段暫存器,因為近呼叫發生在一個程式碼內的呼叫,因此不需要向棧中壓入和切換程式碼段,而遠呼叫因為發生在不同的程式碼段間,因此需要儲存和切換程式碼段。但對於NT系列的windows,因為使用了平坦記憶體,在同一程序內的程式碼都是在一個大的4GB段中,因此不必再考慮段的差異,幾乎所有時候使用的都是近呼叫。

下面來看RET指令,RET指令用於從被呼叫過程返回到發起呼叫的過程,RET指令可以有一個可選的引數n,用於指定ESP暫存器要遞增的位元組數,ESP遞增n個位元組相當於從棧中彈出n個位元組,經常用來釋放壓在棧上的引數。相對於近呼叫的返回稱為近返回(Near Return),相對於遠呼叫的被稱為遠返回(Far Return)。

對於近返回,CPU所執行的操作如下:

1.  將位於棧頂的資料彈出到EIP暫存器,這個值應該是發起近呼叫時CALL指令壓入的返回地址。

2.  如果RET指令包含引數n,那麼便將ESP暫存器的位元組數遞增n。

3.  繼續執行程式指標所指向的指令,通常就是父函式中呼叫指令的下一條指令。

而對於遠返回,在第一步和第二步之間,CPU會彈出執行遠呼叫時壓入的CS暫存器。所以,RET指令只是單純地返回到執行這條指令時棧頂所儲存的地址,如果棧暫存器(ESP)沒有指向合適的位置或棧上的地址被破壞了,那麼RET指令就返回到其他地方。

相關推薦

讀書筆記_CALLRET指令

     CALL指令是x86CPU中專門用作函式呼叫的指令,它的作用就是將當前的程式指標(EIP暫存器)值儲存到棧中(稱為linking information),然後轉移到(branch to)目標運算元所指定的函式(被呼叫過程)繼續執行。    根據被呼叫過程是否位於

《組合語言(第三版)》王爽筆記(10)CALLRET指令

第十章 CALL和RET指令 call和ret也是轉移指令,它們都修改IP或同時修改CS和IP。他們經常被共同用來實現子程式設計。 ret指令用棧中資料修改IP,實現近轉移。使用方法:ret retf指令用棧中資料修改CS和IP,實現遠轉移。使用方法:retf

java讀書筆記---HashMapHashTable

多個 大小 c語言 先來 方法 內部實現 計算 iterator put 首先來說說HashMap,HashMap是一個類,Java中所有的類都繼承自一個Object類。Object類中定義了hashCode()方法,換言之,任何類都會有這個hashCode()方法。 因此

語言學習讀書筆記PHPasp.net編程語言哪個更有前途?

asp .NET PHP 編程 數據庫 編程語言一直是學習計算機編程門專業的熱門討論話題,而我也選擇了這個專業,入學一年了,馬上面臨著語言的選擇問題,業余我需要選擇一門編程語言作為重點研究對象,那麽問題來了:到底是選擇PHP還是ASP.NET呢?這是個需要仔細考慮的問題。關於PHP語言:P

高質量程式設計讀書筆記之類物件

1.類的生命週期由類載入器載入開始,到類解除安裝結束,其中會經過連線、初始化等操作: 1.當類載入器預感到需要使用 該類時,會主動載入該類的二進位制資料,產生的結果為: 1.讀取二進位制資料到方法區; 2.在堆記憶體中生成該類對應的Class物件,用以描述方法區中二

10 CALLRET指令

1、ret指令用棧中的資料,修改IP的內容,從而實現近轉移; retf指令用棧中的資料,修改CS和IP的內容,從而實現遠轉移 CPU執行ret指令時,進行下面兩步操作: (1)(IP) = ((ss)*16+(sp)) (2)(sp) = (sp)+ 2 CPU執行

第十章 CALLRET指令

一、ret和retf ①ret:用棧中的資料修改IP的值,從而實現近轉移。 ret指令的兩步操作: (IP)=((SS)*16+(SP));(SP)=(SP)+2。 ②retf:用棧中的資料修改CS和IP的值,從而實現遠轉移。 retf指令的四步操作: (IP)=((SS)*16+(SP));(S

《現代作業系統》讀書筆記 — 程序執行緒

一、程序和執行緒 什麼是程序 程序是程式執行的一個過程,程式指的是我們通常意義上的程式碼,一個程式可以被執行多次,也就產生了多個程序。程序是作業系統資源分配和排程的基本單位,是作業系統結構的基礎。每個程序都有屬於自己的地址空間。 作業系統中的程序一般由三部分組

程式碼整潔之道讀書筆記--物件資料結構

1.過程式程式碼VS面向物件程式碼 過程式程式碼便於在不改動既有資料結構的前提下新增新函式。面向物件程式碼便於在不改動既有函式的前提下新增新類。 反過來說: 過程式程式碼難以新增新資料結構

Effective C++ 讀書筆記----介面類的設計

新型別的物件怎麼建立和銷燬。這關乎到建構函式和解構函式以及記憶體分配函式和釋放函式。 物件的初始化和物件的賦值有什麼樣的差別。這是建構函式和賦值函式需要考慮的問題。 新型別的物件如果被值傳遞,意味著什麼。拷貝建構函式用來定義設計的型別的值傳遞該如何實現。 什麼是新型別的合法值。在建構函式和賦值操作符中必須對值

組合語言學習第十章-CALLRET指令

     (sp)=(sp)-2      ((ss)*16+(sp))=(IP)(IP與CS壓棧) (2) (CS)=標號處所在的段地址       (IP)=標號處所在的偏移地址 call far ptr 標號相當於: push CS push IP jmp far ptr 標號      10.

十八、使用callret指令實現子程式的呼叫返回

1. 子程式實現的基礎——跳轉:     1) 彙編中的子程式即等價於C語言的函式,即實現程式的模組化;     2) 在組合語言中,子程式其實就是以一個標號起始,最後有類似C函式的返回指令的一段程式碼塊,主程式可以在中途呼叫該程式碼塊(其實就是跳轉到子程式執行),呼叫結束

javascript高階程式設計讀書筆記 calleecaller的區別

1. callee重新呼叫函式,用來減少程式碼耦合度 例:階乘 function factorial(num){if (num<=1) {return 1;}else{return num*arguments.callee(num-1);} } 2. caller儲存

callret指令用法

call和ret都是轉移指令,它們都可以修改IP或者同時修改CS:IP,它們被共同用來實現子程式的設計 ret和retf區別 ret是用棧中的資料修改IP的值,實現近轉移(段內轉移) retf是用棧中的資料修改cs:IP的值,實現遠轉移(段間轉移) 1cpu執行ret時,

《52講輕鬆搞定網路爬蟲》讀書筆記 - SessionCookie

前提 51 也有個文章跟我一樣,是我自己投的稿哈     為什麼要用Session和Cookie? 簡單一句話,因為Session和Cookie可以記錄使用者狀態資訊 嘶..這到底啥意思呢?   背景一:動態網頁的出現 什麼是靜態網頁 含義:一個網頁的內容是HTML程式碼編寫的

《javascript設計模式》讀書筆記二(封裝隱藏信息)

mil del ims 是你 信息 私有屬性 bsp delet urn 1.為什麽要封裝和信息隱藏 做過編程的朋友們知道“耦合”這個詞。事實上封裝的效果就是為了解耦,讓類和類之間沒有太多的聯系,防止某一天改動某一類的時候,產生“多米骨諾牌效應”。 我們能夠把信息隱

《C#圖解教程》讀書筆記之四:類繼承

intern html pan 類中訪問 ted obj 小寫 his new 本篇已收錄至《C#圖解教程》讀書筆記目錄貼,點擊訪問該目錄可獲取更多內容。 一、萬物之宗:Object   (1)除了特殊的Object類,其他所有類都是派生類,即使他們沒有顯示基類定義。   

《UNIX環境高級編程》讀書筆記之系統數據文件信息(1)

返回 -m 獲取 高級編程 記得 clas oid data- size 1.UNIX系統口令文件包括了下圖所看到的的各字段,這些字段包括在<pwd.h>中定義的passwd結構體中 POSIX定義了兩個獲取口令文件項的函數。在給出用戶登錄名或用戶ID後

《Linux內核設計與實現》讀書筆記(十六)- 頁高速緩存頁回寫

第一次 源碼 進行 lose 減少 文件緩存 掩碼 recycle 創建 主要內容: 緩存簡介 頁高速緩存 頁回寫 1. 緩存簡介 在編程中,緩存是很常見也很有效的一種提高程序性能的機制。 linux內核也不例外,為了提高I/O性能,也引入了緩存機

<C指針---讀書筆記6>

返回值 log enter val 其他 9.png 筆記 align eight 指針 指針是一種變量,和int、float、char一樣,是一種基本的變量。只不過它比較抽象一些。 我們知道在C語言中,聲明一個變量a、b,編譯器會為其分配一個物理地址 addr_1 、ad