說到計算機,你們都知道現代計算機都是由馮諾依曼體系結構組成的,也就是儲存程序計算機。讓我先從它的工做模型提及。編程
馮諾依曼體系結構由運算器、控制器、存儲器、輸入設備和輸出設備組成,其中指令與數據同時存放在儲存區中。它們工做時的狀態如圖所示:spa
咱們的程序運行時,通常都是操做系統當作程序與硬件之間的「中間人」,而應用程序與操做系統之間的交互,則依賴於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
其中以.開頭的命令都是做爲連接的命令,咱們把以.開頭的行所有刪除,獲得彙編代碼以下: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課程