c理c利用計算機怎么彈,通過匯編一個簡單的C程序,分析匯編代碼理解計算機是如何工作的...

通過匯編一個簡單的C程序,分析匯編代碼理解計算機是如何工作的

計算機的工作方式:

現代計算機的基本體系結構都是采用馮諾依曼結構,馮諾依曼的設計思想最重要之處是"存儲程序"的這個概念。計算機的工作過程,就是執行程序的過程。首先編寫需要執行的程序,然后通過輸入設備送到存儲器保存起來,即程序存儲。根據馮諾依曼的設計,計算機應能自動執行程序,而執行程序又歸結為逐條執行指令。執行一條指令又可分為以下4個基本操作:取出指令:從存儲器某個地址中取出要執行的指令送到CPU內部的指令寄存器暫存。

分析指令:把保存在指令寄存器中的指令送到指令譯碼器,譯出該指令對應的微操作。

執行指令:根據指令譯碼,向各個部件發出相應控制信號,完成指令規定的各種操作。

為執行下一條指令作好準備,即取出下一條指令地址。

接下來通過一個簡單的c程序來分析一下,程序的執行過程

這里是一個非常簡單的c程序,源代碼如下:

ae6167ff4cb52213ca13f37b3445de03.png

輸入:gcc S o main.s main.c m32 來生成匯編代碼

整潔一下匯編代碼以后,查看匯編代碼:

108cc96f8dc8072581974f6d37f3a85c.png

我在我的虛擬機中的ubuntu系統與實驗樓ubuntu系統的匯編代碼有點不一樣

6992331c4bdde1147cb1a8f1b79ed7f8.png

c97f27296b27a3eab54e3b636f91323f.png

下面通過gdb單步執行來分析棧上寄存器的情況:

首先我們從main函數開始。(前兩條語句在gdb執行時設置不了斷點,但是執行函數的語句都有這2條,放到其他函數來說明):

在main函數上先設置一個斷點,然后運行:

886ba10a5751e1df4a4b975009074a0e.png

此時查看寄存器的值:

90413433ac7eb4d928e57c1ba9621d1a.png

他們的值:esp和ebp都是0xbffff568,eip是0x8048409(正好是下一條要執行的指令的地址)

接下來繼續執行:

9b8596fe4b0f10b42c46b28efadcfc0e.png

把2壓到棧上

56f0528a6a6825ba7b31839423cc89f5.png

40dc9c3c9795737d9715224ac5645226.png

此時,esp的減4了,而ebp不變,eip繼續指向下一條指令

下一條要執行call指令,這里再對函數f設置一個斷點,繼續執行:

afc349859f45b4febfa0a12051c3a994.png

此時,程序跳到函數f中去了

call ?f

調用函數 f,其實這條指令等價于

pushl %eip

movl ?$f, %eip

eip的值被保存在esp-4的位置上,保存eip的目的是函數調用返回時能夠繼續執行call f下面的語句:

cbcbdf8ee270321f5c3fee4944fece1c.png

此時,esp的值為0xbffff560,ebp都是0xbffff568

跳轉到函數f后,前兩條語句和 main 函數相同,都是保存堆棧狀態,這里詳細來說明一下:

先把ebp的值保存咋esp-4的位置上

3abf0c4cc8e97e8bc3d52983b7d38aae.png

再把esp的值賦給sbp,此時esp和ebp的值都為0xbffff55c

436da4d160ba8a01f16d802de804af18.png

然后繼續執行,把ebp+8的內容即2這個值壓棧:

588b53a7096b99025c73c5c45603988f.png

此時esp繼續-4

1a0a4ee0fb8404a33ba3111897d92d54.png

查看寄存器的值

604bbc794c6a200bbae5b5279e12aa23.png

寄存器的值:esp的值為0xbffff558,ebp的值為0xbffff55c,

接下來要跳轉到函數g了,因此再對函數g設置一個斷點,然后繼續執行:

628610b87e2503a0059db588b281d4b5.png

觀察寄存器的值:

317816ba5ab297255c5b2b7582d83190.png

同理:寄存器eip的值繼續被保存了在esp-4的位置上,以便能夠返回到函數f

34cf00bb97c7bb38a693b3e61fd51596.png

進入g函數老的ebp的值也被保存了,新的esp和ebp相同

2dc767f39af40e9f3139088683e83005.png

此時,esp和ebp的值都是0xbffff550

接下來繼續執行,把ebp+8的值給eax

034a6a0df6abb46a790de68d70553042.png

查看寄存器,此時esp和ebp的值都是0xbffff550,eax的值是2

86d8989fb7536445983642f1445f580d.png

繼續執行:

3a21db9510258ef8054d6668c76b91ec.png

把3和eax的值相加結果再保存到eax中

查看寄存器

54ea0edcb1f345612b52f60af51d787f.png

寄存器eax的值變成5了,esp和ebp的值都是0xbffff550

然后繼續執行:

ac998cefd695d3beefdb7c4ce55c2886.png

把esp指向的值給ebp,查看寄存器

10ca44431e7465c5c523897279c83ada.png

寄存器的值:esp的值為0xbffff554,ebp的值0xbffff55c,eax還是5

然后繼續執行:

ed696eace9cf38d71a8391d6427dd519.png

指令ret相當于指令popl %eip

b4df7d8359fa4476e676a5dd15dc4d44.png

esp的值為0xbffff558,ebp的值0xbffff55c,eax還是5

這樣又返回到函數f繼續執行:

aa07bad4a292a71b4a6d4aad0fd0343d.png

繼續執行,然后查看寄存器:

051e9c080cde60c1aad0e21dd51b5364.png

Esp和ebp的值都是0xbffff55c,eax還是5

繼續執行,leave,這條指令相當于下面兩條指令:

movl ?%ebp, %esp

popl ?%ebp

查看寄存器

ce8cb4231557f90eccda819929abaa23.png

esp的值為0xbffff560,ebp的值0xbffff568,eax還是5

繼續執行ret,彈出保存的eip的值,返回到main函數執行:

f85ecb1e0e87f5ba989c3b1164965f3a.png

查看寄存器的值,esp的值為0xbffff564,ebp的值0xbffff568,eax還是5

98eb8bc9e502b09ebe1005a9248e72ad.png

連續執行2步,繼續執行

9f85a7b59a58cfaca5d3c271ef1ad8a9.png

此時eax的值變成了6,esp和ebp的值0xbffff568

12de514440cfa16420b5f3ea512670af.png

然后繼續執行2步,main函數就返回了

055d7118327f58942bfdce3e7ca8c6af.png

總結

通過分析對應的匯編代碼和觀察運行棧的變化,加深了對程序執行過程的了解,也明白了計算機的工作方式:根據eip 指指令執行,同時eip自增;

如果執行的是跳轉語句時,先把eip壓棧,然后將需要跳轉的目的地址賦給 eip,實現跳轉;

若執行函數調用時,將 eip 壓棧,同時將ebp壓棧,然后將相應函數地址賦給 eip;

若為其他指令,則繼續從 eip 指向的地址取指令執行。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/539296.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/539296.shtml
英文地址,請注明出處:http://en.pswp.cn/news/539296.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux安裝MySQL的兩種方法

原文鏈接:http://blog.csdn.net/superchanon/article/details/8546254 --------------------------------------------------------------------------------------- 1. 運行平臺:CentOS 6.3 x86_64,基本等同于RHEL 6.3 2. 安裝…

jenkins 手動執行_想知道如何用Jenkins自動執行Python腳本輸出測試報告?

前言在用python做自動化測試時,我們寫好代碼,然后需要執行才能得到測試報告,這時我們可以通過 Jenkins 來進一步完成自動化工作。借助Jenkins,我們可以結合 Git/SVN 自動拉取代碼,可以設置定時構建,接著就可…

VR 影院,約嗎?

世界第一家 VR 影院已經開張,朋友,去不? 世界第一家 VR 影院正式開張 (無大屏的 VR 電影院) 在被稱為 VR 元年的 2016 年,越來越多的人加入了這個新興的領域,各種傳統應用也在被 VR 包裝之后以…

redis cluster 分布式鎖_關于分布式鎖原理的一些學習與思考redis分布式鎖,zookeeper分布式鎖...

首先分布式鎖和我們平常講到的鎖原理基本一樣,目的就是確保,在多個線程并發時,只有一個線程在同一刻操作這個業務或者說方法、變量。在一個進程中,也就是一個jvm 或者說應用中,我們很容易去處理控制,在jdk …

會計行業被計算機取代馬云,會計人:為什么我神煩“人工智能取代說”?

原標題:會計人:為什么我神煩“人工智能取代說”?原創來源:學會計有方法從財會機器人誕生到馬云的無人商店,全行業掀起了一股“人工智能取代說”的熱潮。有些財會朋友在一輪又一輪的信息轟炸下,倍感壓力&…

mysql5.6允許遠程服務器訪問數據庫

創建一個mysql用戶,并設置可以遠程訪問 grant usage on *.* to fredlocalhost identified by fred;//創建用戶fred密碼ferdselect host,user,password from mysql.user where userfred;//查看記錄 grant all privileges on *.* to fred%identified by fred;//設置可以遠程訪問…

sp烘焙流程_小手雷-PBR材質流程(一)——(基本材質)

小手雷-PBR材質流程(一)Substance Painter生存手冊經過了12個章節的講解后,已經完結了(。・ω・。)相信大家經過了生存手冊這一基礎教程過后,對Substance Painter這款軟件已經有了比較堅實的基礎了,…

MyBatis-進階2

typeHandler typeHandler有什么用? 你可以重寫類型處理器或創建你自己的類型處理器來處理不支持的或非標準的類型。 具體做法為:實現 org.apache.ibatis.type.TypeHandler 接口, 或繼承一個很便利的類 org.apache.ibatis.type.BaseTypeHandle…

python中 r是什么意思_python中rb含義理解

Python文件讀寫的幾種模式: r,rb,w,wb 那么在讀寫文件時,有無b標識的的主要區別在哪里呢? 文件使用方式標識 r:默認值,表示從文件讀取數據 w:表示要向文件寫入數據,并截斷以前的內容 a:表示要向文件寫入數據&#xff0…

哈佛大學計算機生物科學,生命科學專業

【出國留學網】昨日,泰晤士報公布了最新版2018年世界大學生命科學排名,哈佛大學位列第一。本文是關于世界各國大學在本次生命科學排名中的具體表現,供你選校參考。The 2018 Times Higher Education World University Rankings’ table for li…

怎樣呵護友誼_呵護真正的友情,助力漫長的人生

友情,即友誼,是指朋友和朋友之間的感情。它是一種很美妙的東西,可以讓你在失落的時候變得高興起來,可以讓你走出苦海,去迎接新的人生。它就像一種你無法說出又可以感到快樂無比的東西。只有擁有真正朋友的人&#xff0…

【Day41】Python之路——AJAX

什么是AJAX AJAX Asynchronous JavaScript and XML(異步的 JavaScript 和 XML)。 優點: 不重新加載整個頁面的情況下,可以與服務器交換數據并更新部分網頁內容 不需要任何瀏覽器插件,但需要用戶允許JavaScript在瀏覽器上執行 同源…

LINUX重啟MYSQL的命令

原文:http://blog.csdn.net/liuyong0818/article/details/5693336 ------------------------原文有錯誤,本文轉載時已修改--------- 如何啟動/停止/重啟MySQL 一、啟動方式 1、使用 service 啟動:service mysql start 2、使用 mysql 腳…

html css子標簽,HTML+CSS系列:CSS選擇器(標簽、ID、類、通配符、后代、子元素、并集、偽類)...

一.標簽選擇器Documenth1 {color: red;}h2{color: green;}Hello World!Hello World!Hello !Hello !二.類選擇器Document.box {color: green;}.box1 {font-size: 26px;}Hello World!Hello World!三.ID選擇器Document#box{color: green;}Hello World!四.通配符選擇器Document*{ma…

aes離線解密工具_如何在Python中解密OpenSSL AES加密文件?

OpenSSL為AES加密提供了一種流行的(但不安全 - 見下文!)命令行界面:openssl aes-256-cbc -salt -in filename -out filename.encPython以PyCrypto包的形式支持AES,但它只提供工具。如何使用Python / PyCrypto解密使用OpenSSL加密的文件&#…

什么是Hive

Hive 是建立在 Hadoop 上的數據倉庫基礎構架。 它提供了一系列的工具,可以用來進行數據提取轉化加載(ETL ),這是一種可以存儲、查詢和分析存儲在 Hadoop 中的大規模數據的機制。 Hive 定義了簡單的類 SQL 查詢語言&#xff0c…

VUE-搜索過濾器

VUE非常實用的搜索過濾&#xff0c;喜歡點個贊哦 廢話不多說&#xff0c;先來看看效果 1 引入vue <script src"https://cdn.jsdelivr.net/npm/vue"></script>2 HTML <div id"app"><input v-modelsearch /><ul v-if"search…

單選按鈕必填會有紅色選中提示嗎_為什么單選按鈕和復選框不能共存?

以下內容由摹客團隊翻譯整理&#xff0c;僅供學習交流&#xff0c;摹客設計協作一站式云平臺&#xff0c;從產品、設計到開發&#xff0c;摹客來解決。單選按鈕和復選框長期以來一直都是容易導致用戶困惑的組件。這兩個組件通常用于相同的情景下&#xff0c;但看起來又完全不同…

用計算機進行服裝設計,電腦服裝設計(10制版1班)

《電腦服裝設計》課程教學大綱課程名稱:電腦服裝設計(Corldraw和Photoshop)課程代碼:10617313總學時&#xff1a;68課時適用專業&#xff1a;10制版方向學生開課單位&#xff1a;時裝設計學院一、講課內容第一章 CORELDROW軟件整體的介紹第一節緒論, 與其他圖形繪制軟件的區別及…

程序包org.junit.jupiter.api不存在

在跑項目的時候遇到這個問題&#xff0c;去看pom文件一切正常&#xff0c;也引入了這個依賴 <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.2</version> <scope>test</scope&…