“C語言” 讀書劄記(五)之[讓我們一起學習彙編吧!(段)]

來源:互聯網
上載者:User
 介紹   這幾天滿腦子都是寄存器,儲存空間——主要是卡在組合語言上了,所以博文進度比較緩慢。   今天就先講講如何定義資料元素吧?因為組合語言程式最重要的任務之一就是處理對象。 

段 

三個最常用的段: 1、資料區段:資料區段聲明帶有初始值的資料元素。這些資料元素用作組合語言程式中的變數。 2、bbs段:bbs段聲明使用零(或者null)值初始化的資料元素。這些資料元素常用做組合語言程式中的緩衝區。 3、文本段:在可執行程式內聲明指令碼的地方。 1、定義段    GNU彙編器使用.section命令語句聲明段。  文法:.section 類型(.data,.bss,.text)  以下是組合語言程式的布局。  

2、定義起始點   1)當組合語言程式被轉換為可執行檔時,連結器必須知道指令中的起始點是什麼  GNU彙編器聲明一個預設標籤,或者說標識符,它應該用作應用程式的進入點。_start便簽用於標明程式應該從這條指令開始運行。   2)除了應用程式中聲明起始標籤之外,還需要為外部應用程式提供進入點。這是使用.globl命令完成的。 瞭解上述資訊就可以為所有組合語言程式建立基礎模板。如下:

 

有了這樣的模板,就準備好了開始編寫組合語言程式。

3、建立簡單程式   我們來示範上面那些組件如何組合在一起使用。  先寫個簡單的"hello,world“,很多語言不都這麼搞嗎?我也不免俗。——其他部分我會在後期的文章中說明。
 1  .section .data 2  output: 3     .ascii "hello,world\n" 4   5  .section .text 6  .globl _start 7  _start: 8     movl $4, %eax 9     movl $1, %ebx10     movl $output, %ecx11     movl $13, %edx12     int $0x8013 14 #success exit15     movl $1, %eax16     movl $0, %ebx17     int $0x80

                                  彙編並且連結這個過程

 

 

資料區段   1)資料區段定義的資料元素都 保留在記憶體中
NOTE   用.data資料區段定義的任何資料元素可以按照讀取和寫入模式訪問。   用.rodata資料區段定義的任何資料元素只能按照唯讀(read-only)模式訪問。——因此使用ro首碼。
   2)資料區段定義資料元素需要用到兩個語句:    一個標籤:像C語言中變數名稱,用作引用資料元素所使用的標記。——標籤對處理器是沒有意義的,它只是彙編器試圖訪問記憶體位置時用作引用指標的一個位置。(機器碼中使用bit表示這個標記)    一個命令:定義資料元素保留多少個位元組。

  3)下表介紹為特定資料元素類型保留記憶體的不同命令。     4)我們來觀察一下在記憶體中分布情況,為了表達更清楚,我再寫一個例子。

 

 

 

 

 

 

 

                                 記憶體分布圖

觀察

  按照資料區段中定義資料元素的順序,每個資料元素被存放到記憶體中。帶有多個值的元素按照命令中列出的順序存放(如msg和length)。

 

靜態符號   .equ命令用於把常量(呵呵,這個不用說,常量嗎?在程式中是不能改動的,這也是它最大的特色)設定為可以在文本段(我們可以理解為指令段)中使用的符號。設定方法如下  

NOTE   .equ命令可以出現在資料區段的任何位置,但是為了方便閱讀,最好集中定義在最前或最後。

 

 以上兩種都是定義在資料區段中,這也是在彙編中經常使用的方法。下面介紹另外一種段聲明——bbs段。

bss段   bbs段只聲明原始記憶體部分。   GNU彙編器使用兩個命令聲明緩衝區。

 

 

 

 總結   我一直在想從哪個角度能輸入剖析C語言,很多資料顯示從彙編和機器語言角度去理解C語言,方能真正明白。我也看了很多資料,覺得應該從最最基礎的方面進行。所以今天先談到這裡。——要知後事如何,下回分解。   這兩天參考的資料    《組合語言》——這書主要是針對windows 平台,文法使用的是intel文法。而我的平台,也是我的工作平台,習慣平台是linux,而linux採用的是“AT&T文法“。所以我也就看了前幾章有關硬體方面的內容(但是也沒看懂多少東西,呵呵)。    《組合語言程式設計》——這書是我側重點看的,直接跳到第二部分基礎語言部分進行研究。    《Linux C編程一站式學習》——這書我著重看了幾遍“x86組譯工具基礎”。收益匪淺。    《深入理解電腦系統》——這書我也是輕微的看了一下,很多地方還是沒有怎麼弄懂。我還得多看幾遍。 題外話 

機器指令展開來講,就是機器可以正確執行的命令。

  電子電腦的機器指令是一列二進位的數字,電腦將指令轉變為一列高低電平,以使電腦的電子器件受到驅動,進行運算。  CPU是電腦的核心組件,控制整個電腦的運作並進行運算。
  1、地址匯流排的寬度決定了CPU的定址能力;  2、資料匯流排的寬度決定了CPU與其他器件進行資料傳送時的一次資料傳送量。  3、控制匯流排的寬度決定了CPU對系統中其他器件的控制能力。 單元換算:  1B = 8b  1KB = 1024B  1MB = 1024KB  1GB = 1024MB
 

推薦    
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.