程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C指針原理(86)-helloworld的C程序匯編剖析(2)

C指針原理(86)-helloworld的C程序匯編剖析(2)

編輯:關於C語言

分析通過GCC編譯C語言程序生成的匯編代碼,能清楚得了解C語句運行機制、內存分配機制等隱藏在C語言代碼下的內部工作原理。下面將對helloworld程序生成的匯編進行分析。

(1)寄存器基礎知識

寄存器是中央處理器內的組成部份。寄存器是有限存貯容量的高速存貯部件,它們可用來暫存指令、數據和地址。在中央處理器的控制部件中,包含的寄存器有指令寄存器(IR)和程序計數器。在中央處理器的算術及邏輯部件中,包含的寄存器有累加器。

雖然計算機都擁有內存,但由於CPU的運行速度一般比主內存的讀取速度快,訪問內存所需要的時間為數個時鐘周期,要訪問內存的話,就必須等待數個CPU周期從而造成浪費,因此內存並不是數據存取最快的裝置,後來在現代計算機上使用的AMD或Intel微處理器在芯片內部集成了大小不等的數據高速緩存和指令高速緩存,統稱為cache(高速緩存),cache讓數據訪問的速度適應CPU的處理速度,其原理是內存中程序執行與數據訪問的局域性行為,即一定程序執行時間和空間內,被訪問的代碼集中於一部分,但是這些仍不是訪問數據最快的途徑。

寄存器是存儲器層次結構中的最頂端,也是系統操作數據的最快速途徑,但它數量少能存儲的空間有限,它直接安放在中央處理器內,是有限存貯容量的高速存貯部件,可用來暫存指令、數據和地址。

IA-32處理器有8個通用寄存器,分別為:
EAX 一般用作累加器
EBX 一般用作基址寄存器(Base)
ECX 一般用來計數(Count)
EDX 一般用來存放數據(Data)
EBP 一般用作堆棧指針(Stack Pointer)
EBP 一般用作基址指針(Base Pointer)
ESI 一般用作源變址(Source Index)
EDI 一般用作目標變址(Destinatin Index)

IA-32處理器有6個常用的段寄存器,分別為 :
CS 代碼段寄存器
DS 數據段寄存器
SS 堆棧段寄存器
ES、FS及GS 附加數據段寄存器

它還有標志寄存器EFLAGS,用來存放有關處理器的控制標志,此外還有控制寄存器.還擁有調試寄存器和測試寄存器以及系統地址寄存器。

這些寄存器,使用的最多的是通用寄存器,在AT&T匯編中,使用%寄存器名的方式表示通用寄存器,比如:

%ebx表示ebx寄存器

%ecx表示ecx寄存器

麥好的AI樂園博客所有內容是原創,如果轉載請注明來源

http://blog.csdn.net/myhaspl/


(2)C變量內存分配

在C語言中,變量在內存中擁有自己的位置,這個位置就是變量的地址,可用指針來保存這個地址。而匯編語言中變量包括標記、數據類型、默認值三個部分,標記指示了變量的內存位置,存儲的數據類型決定了變量在內存占有多少字節的空間,默認值決定了變量的初始值。觀察上面C語言版的helloworld生成的匯編代碼中的一段(如下所示),輸出的helloworld字符串被放置在由“.LC0”標記的內存中,類型為string型,默認值為"hello,world"。

.LC0:

.string "hello,world"


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved