在組合語言中,用到的工具主要用以下幾個:
彙編器、聯結器、偵錯程式、編譯器
因為我在這裡的是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 :執行
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
位**
其實,單純用彙編來開發的程式已經很少了。我學習這個,主要目的有兩個:
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:
《執行**放在這》
今天就寫到這吧,明天用具體例項來說一下今天所說的工具的用法。 AT T組合語言 工具及程式組成
在組合語言中,用到的工具主要用下面幾個 彙編器 聯結器 偵錯程式 編譯器 由於我在這裡的是at t 組合語言。所以工具下也都是 gnu下的那些。1.1 彙編器 as 彙編器有非常多,masm nasm,gas 等,不像高階語言,儘管都叫組合語言。但不同的彙編器,其語法是存在非常大不同的。intel ...
AT T組合語言 工具及程式組成
在組合語言中,用到的工具主要用以下幾個 彙編器 聯結器 偵錯程式 編譯器 因為我在這裡的是at t 組合語言,所以工具下也都是 gnu下的那些。1.1 彙編器 as 彙編器有很多,masm nasm,gas 等,不像高階語言,雖然都叫組合語言,但不同的彙編器,其語法是存在很大不同的。intel 彙編...
組合語言 AT T組合語言
這兩天的pwn題環境都是在linux中,採用的組合語言是 at t 格式。之前學習的是intel格式的8086彙編,今天學習了下at t組合語言。基於x86 架構的處理器所使用的彙編指令一般有兩種格式 操作intel格式at t格式 暫存器命名 push eax pushl eax 常數 立即運算元...