1. 程式人生 > >反彙編一個簡單的C程式,分析彙編程式碼

反彙編一個簡單的C程式,分析彙編程式碼

李峰

原創作品轉載請註明出處

實驗

原始碼:

int g(int x)
{
    return x + 4;
}

int f(int x)
{
    return g(x);
}

int main()
{
    return f(10) + 3;
}

輸入:

gcc -S -o main.s main.c -m32

反彙編程式碼:

    .file   "201504411_\345\217\215\346\261\207\347\274\226.c"
    .text
    .globl  g
    .type   g, @function
g:
.LFB0:
    .cfi_startproc
    pushl   %ebp
    .cfi_def_cfa_offset 8
    .cfi_offset 5, -8
    movl    %esp, %ebp
    .cfi_def_cfa_register 5
    movl    8(%ebp), %eax
    addl    $4, %eax
    popl    %ebp
    .cfi_def_cfa 4, 4
    .cfi_restore 5
    ret
    .cfi_endproc
.LFE0:
    .size   g, .-g
    .globl  f
    .type   f, @function
f:
.LFB1:
    .cfi_startproc
    pushl   %ebp
    .cfi_def_cfa_offset 8
    .cfi_offset 5, -8
    movl    %esp, %ebp
    .cfi_def_cfa_register 5
    subl    $4, %esp
    movl    8(%ebp), %eax
    movl    %eax, (%esp)
    call    g
    leave
    .cfi_restore 5
    .cfi_def_cfa 4, 4
    ret
    .cfi_endproc
.LFE1:
    .size   f, .-f
    .globl  main
    .type   main, @function
main:
.LFB2:
    .cfi_startproc
    pushl   %ebp
    .cfi_def_cfa_offset 8
    .cfi_offset 5, -8
    movl    %esp, %ebp
    .cfi_def_cfa_register 5
    subl    $4, %esp
    movl    $10, (%esp)
    call    f
    addl    $3, %eax
    leave
    .cfi_restore 5
    .cfi_def_cfa 4, 4
    ret
    .cfi_endproc
.LFE2:
    .size   main, .-main
    .ident  "GCC: (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3"
    .section    .note.GNU-stack,"",@progbits

g函式:

函式g

f函式:

函式f

main函式:

主函式

堆疊的變化

暫存器 內容 地址
0
ebp = 0 4
10 8
eip = 56 (addl $3, %eax) 12
ebp = 4 16
10 20
eip = 36 (leave) 24
esp-> ebp = 4 28

然後不斷地出棧

計算機如何工作

如今的計算機處理器的結構主要分為兩類,一類是馮·諾伊曼結構,一類是哈佛結構。
其中馮·諾伊曼結構是一種將程式指令儲存器和資料儲存器合併在一起的結構,哈佛結構是一種將程式指令和資料分開儲存的結構,無論哪種結構,一般的流程都是cpu到儲存器中讀取程式指令,然後譯碼,執行,當需要資料時,再到儲存器中讀取資料。指令都是順序執行,直到指令結束。

相關推薦

彙編一個簡單C程式分析彙編程式碼

李峰 原創作品轉載請註明出處 實驗 原始碼: int g(int x) { return x + 4; } int f(int x) { return g(x); }

一個簡單程式記錄虛擬碼的使用

計算工資 1 Display "Enter working time: " 2 3 Input workTime 4 5 Display "Enter salary: " 6 7 Input salary 8 9 Display "Your total salary are ", salar

Swing 實現一個簡單窗體程式並打成可執行jar包

1. 前言 在做App自動化測試時,需要經常獲取裝置資訊,Apk的包名,啟動activity等,每次都用命令列獲取很是麻煩,於是想到做一個窗體程式,只需要點幾個按鈕,就可以獲得所需資訊。最終介面如下: 2.佈局思路 這裡不對窗體具體功能做介紹,說一

《linux核心分析》作業一:彙編一個C語言程式分析彙編程式碼執行過程

楊新峰原創作品轉載請註明出處  《Linux核心分析》 MOOC課程http://mooc.study.163.com/course/USTC-1000029000  實驗環境:實驗樓網站64位linux虛擬機器 原始碼如下: int g(int x){ re

103-第一個c#程式結構分析

我們用using引入名稱空間,用namespace定義名稱空間,從{開始,到}結束 // 這裡是註釋 下面的是引入名稱空間 using System; using System.Collections.Generic; using System.Linq; using System.Text; usi

樹莓派跑一個簡單c++小程式教程

我用的是樹莓派3代b型,所使用的是Debian系統的衍生系統raspbian(對系統不太瞭解不清楚)。樹莓派開發c++程式需要的工具有編輯器vim,偵錯程式gdb,編譯器gcc或者g++.(大神飄過就行~~ 記錄一下)用紅筆塗得地方是我命令敲錯的地方,大家忽略就行。 安裝vim   執行

c++ 一個簡單的mapstruct小應用

題目要求: Test Program (24-2-2012) BANKING SYSTEM PROJECT Description: This C++ programs on BANKINGSYSTEM has account class with data members

近日有需要寫點C#程式有用到Dataset資料集和SQLite資料庫由於我從來就不擅長記各種程式語言的語法所以在查閱一堆資料後留下以下內容備忘: 一、SQLite操作直接貼程式碼簡單

近日有需要寫點C#程式,有用到Dataset資料集和SQLite資料庫,由於我從來就不擅長記各種程式語言的語法,所以在查閱一堆資料後,留下以下內容備忘:   一、SQLite操作,直接貼程式碼,很簡單:       //建立一個數據庫檔案     string  d

C#編寫一個控制檯應用程式求1000之內的所有“完數”

wechat:812716131 ------------------------------------------------------ 技術交流群請聯絡上面wechat ----------------------------------------------

一個生成祝福簡訊的簡單C++程式

正值大過年的,很多人對群發簡訊反感,我就靈機一動用Qt寫了一個簡單的祝福簡訊的程式,主要的程式碼如下: voidWidget::printMsg() { inti=0; intj=0; boolrightPoint=false; intmack; intnumBuf[10

今天終於將qt-opengl 的一個簡單程式寫出來了

在建立的時候大家一定注意 在它的管理檔案中一定要新增一句 QT+=openglwidgets 在構建之前一定要記得執行以下 qmake 個是配置工程檔案的 未配置的 時候可能會出現link 2019 的錯誤

初學html任務1:一個簡單html頁面要求:內容頁面裝一篇文章 用html來分段

enter pos 工程師 分享圖片 visit 技術 運行 並且 center 這是主要內容部分,用html實現版塊分布。 接下來是樣式部分。 讓頁面所有元素的padding和margin都設置為0 ; 否則加入一張大的覆蓋的背景圖片後,會由於瀏覽器的緣故,圖片周邊有

一個簡單c#爬蟲程序

count www 數據 排名 其他瀏覽器 pytho 分享 很多 attr 這篇文章只是簡單展示一個基於HTTP請求如何抓取數據的文章,如覺得簡單的朋友,後續我們再慢慢深入研究探討。 圖1: 如圖1,我們工作過程中,無論平臺網站還是企業官網,總少不了新聞展示。

簡單C 程式 擲骰子

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

一個簡單程式談import和from...import的區別

今天在自己寫程式碼的過程中,設計到隨機種子數量(引數),因為一個檔案中可能用到這個引數不止一次甚至是不止一個檔案會用到這個引數。對於訓練一個數據集來說,如果當你的效能跑的差不多的話,肯定會改這個引數,那如果你在函式中給這個引數直接賦了值,後期改的時候牽動會很大,所以這個時候就要想著在另一個檔案中單獨定義這個引

編寫一個Java應用程式當用戶在輸入對話方塊中輸入兩個日期後(日期格式為YYYYMMDD如1999年1月12日應輸入為19990112)程式將判斷兩個日期的先後順序以及兩個日期之間的間隔天數(例

編寫一個Java應用程式,當用戶在輸入對話方塊中輸入兩個日期後(日期格式為YYYYMMDD, 如1999年1月12日應輸入為19990112), 程式將判斷兩個日期的先後順序, 以及兩個日期之間的間隔天數(例如1999年1月1日和1999年1月2日之間的間隔是1天。  

一個簡單的例子帶你理解haproxy!

如果你對haproxy啥都不懂,這篇文章將對你有很大的幫助。大神請繞行! haproxy是一個性能不輸於nginx的工具。和nginx功能類似,可以實現負載均衡。他與nginx不同的是,haproxy既可以實現基於http的七層架構,又可以實現基於tcp/udp的四層架構。 [[email&

頂級測試框架Jest指南:跑通一個完美的程式就是教出一群像樣的學生

facebook三大專案:yarn jest metro,有橫掃宇宙之勢。 這個專案的宗旨為:減少測試一個專案所花費的時間成本和認知成本。 ——其實,它在讓你當一個好老師。jest文件非常簡略、難以閱讀, 因此才有了這篇文章。 jest是vue和vue-cli技術棧

一個linux驅動程式hello

前面已經把學習linux的開發環境搭建好了,現在逐步開始學習開發過程。先從核心驅動開始,寫一個網上已經被寫爛的實列程式。先把它編譯好,放進linux系統執行,看看是什麼樣子。 建立資料夾hello,在資料夾下面建立檔案hello.c程式碼如下: #include <linux/

一個簡單的程序記錄偽代碼的使用

pla 使用 字符 div input 打印 工資 inpu 簡單 計算工資 1 Display "Enter working time: " 2 3 Input workTime 4 5 Display "Enter salary: " 6 7 Input sa