彙編一個簡單的C程序

說到計算機,你們都知道現代計算機都是由馮諾依曼體系結構組成的,也就是儲存程序計算機。讓我先從它的工做模型提及。編程

馮諾依曼體系結構由運算器、控制器、存儲器、輸入設備和輸出設備組成,其中指令與數據同時存放在儲存區中。它們工做時的狀態如圖所示:1spa

咱們的程序運行時,通常都是操做系統當作程序與硬件之間的「中間人」,而應用程序與操做系統之間的交互,則依賴於ABI(Application Binary Interface)。固然,個人水平還遠不到讀寫二進制機器碼的程度,天然也不會深究這個ABI。操作系統

下面,咱們來對一個簡單的C程序進行彙編,C語言源代碼以下:code

int func1(x)
{
    return x + 10;
}

int func2(x)
{
    return func1(x);
}

int main(int argc, char * argv[])
{
    return func2(20) + 8;
}

筆者使用了實驗樓的Linux環境來實現得到程序編譯所得的X86(32位)彙編程序,連接在此: https://www.shiyanlou.com/courses/195orm

使用gcc便可,命令以下:rem

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

其中,-S表示在程序編譯期間,在生成彙編代碼後中止,-o參數輸出彙編代碼文件main.s,而-m32天然就是生成32位的彙編代碼。get

咱們打開main.S,能看到彙編代碼(部分)以下:2it

其中以.開頭的命令都是做爲連接的命令,咱們把以.開頭的行所有刪除,獲得彙編代碼以下:io

func1:
    pushl    %ebp
    movl    %esp, %ebp
    movl    8(%ebp), %eax
    addl    $10, %eax
    popl    %ebp
    ret

func2:
    pushl    %ebp
    movl    %esp, %ebp
    subl    $4, %esp
    movl    8(%ebp), %eax
    movl    %eax, (%esp)
    call    func1
    leave
    ret

main:
    pushl    %ebp
    movl    %esp, %ebp
    subl    $4, %esp
    movl    $20, (%esp)
    call    func2
    addl    $8, %eax
    leave
    ret

至此,咱們就完成了對程序的彙編,而後咱們來看看程序的執行過程:asm

在堆棧增增減減的過程當中,計算機也不斷的取指令、執行指令,完成對程序的執行。



Author : 陳政 / arc001

原創做品轉載請註明出處 《Linux操做系統分析》MOOC課程

相關文章
相關標籤/搜索