1.開發工具
在彙編語言中,用到的工具主要用以下幾個:
彙編器、連接器、調試器、編譯器
因爲我在這裏的是AT&T彙編語言,所以工具下也都是gnu下的那些。
1.1 彙編器(as)
彙編器有很多,masm,nasm,gas等,不像高級語言,雖然都叫彙編語言,但不同的彙編器,其語法是存在很大不同的。Intel彙編的書籍到處可見,可是AT&T的卻少之又少。但想看Linux內核的話,還是要對AT&T彙編熟悉才行。這也許是自己爲什麼學習彙編的原因吧。說到彙編器,我們用的是as,其可選參數有很多,但我們用的幾個:
比如我們要彙編test.s爲ia-32平臺的test.o,
$ as --32 -o test.o test.s
這裏只用到了兩個參數--32和-o
--32:是指定爲ia-32平臺代碼,
-o :後接目標文件
1.2 連接器(ld)
我們選擇ld.用到的參數主要有以下幾個:
-m elf_i386 :將目標代碼連接成elf_i386格式(即32位平臺下的代碼)
-o :後接目標文件
1.3調試器(gdb)
主要的命令有:
list :列出指定的函數或行
break :設置斷點
run :運行
next :下一條指令
step : 執行程序中的下一條指令
1.4編譯器(gcc)
純彙編可以不用gcc。gcc 的參數用到的也不多,有以下幾個:
-g:調試模式的代碼
-o:後接目標代碼
-m32:生成ia32平臺代碼
1.5 其他一些工具
1.5.1 objdump
Objdump是一個非常有用的工具 ,其可以實現反彙編
主要用到的參數有:-d 表示將目標代碼反彙編成指令碼
1.5.2 gprof
gprof打印出程序運行中各個函數消耗的時間,可以幫助程序員找出衆多函數中耗時最多的函數。
1.5.3 操作系統 linux
我的測試環境是ubuntu 14.04 (x86_64 ),但自己學的只是ia-32位彙編,所以,使用--32、-m32、-m elf_i386 生成32位代碼
2 .彙編語言的模板範例
其實,單純用匯編來開發的程序已經很少了。我學習這個,主要目的有兩個:
1.看懂Linux內核中的代碼
2.看懂C/C++等程序生成的彙編代碼
所以,我更希望所用的彙編格式能直接與C語言鏈接起來。
2.1 彙編程序組成
彙編語言由定義好的段組成,每個段都有不同的目的。三個常用的段如下:
數據段(.section .data)
聲明帶有初始值的數據元素,用作彙編 語言程序中的變量
bss段 (.section .bss請問中文該如何翻譯?)
用途彙編語言的緩衝區
文本段 (.section .text)
存放代碼
2.1.1 定義段的方法
GNU彙編器使用.section命令語句聲明段。.section語句使用一個參數——它聲明的段的類型。如下圖所示。這將是我們以後要使用的佈局 。
2.1.2 定義段的起點
當彙編語言程序被轉換成可執行文件時,連接器要知道指向的起點,gnu彙編器聲明一個默認標籤_start,表明程序從這條指令開始。當然,也可以使用連接器參數-e來定義新的起始名稱。
好,下面來總結一下我們的彙編語言的基礎模板:
.section .data
<有初始值的數據放在這>
.section .bss
<未初始化的值放在這>
.section .text
.globl _start
_start:
<運行代碼放在這>
今天就寫到這吧,明天用具體實例來說一下今天所說的工具的用法。