介紹 這幾天滿腦子都是寄存器,儲存空間——主要是卡在組合語言上了,所以博文進度比較緩慢。 今天就先講講如何定義資料元素吧?因為組合語言程式最重要的任務之一就是處理對象。
段
三個最常用的段: 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
推薦