天堂国产午夜亚洲专区-少妇人妻综合久久蜜臀-国产成人户外露出视频在线-国产91传媒一区二区三区

當(dāng)前位置:主頁(yè) > 論文百科 > 大學(xué)課程 >

Linux下的匯編語(yǔ)言之匯編工具

發(fā)布時(shí)間:2017-08-05 08:27

  本文關(guān)鍵詞:匯編語(yǔ)言


  更多相關(guān)文章: Linux 匯編語(yǔ)言


作為最基本的編程語(yǔ)言之一,匯編語(yǔ)言雖然應(yīng)用的范圍不算很廣,但重要性卻勿庸置疑,因?yàn)樗軌蛲瓿稍S多其它語(yǔ)言所無(wú)法完成的功能。就拿 Linux 內(nèi)核來(lái)講,雖然絕大部分代碼是用 C 語(yǔ)言編寫(xiě)的,但仍然不可避免地在某些關(guān)鍵地方使用了匯編代碼,其中主要是在 Linux 的啟動(dòng)部分。由于這部分代碼與硬件的關(guān)系非常密切,即使是 C 語(yǔ)言也會(huì)有些力不從心,而匯編語(yǔ)言則能夠很好揚(yáng)長(zhǎng)避短,最大限度地發(fā)揮硬件的性能。

第二課時(shí):Linux 匯編工具

Linux 平臺(tái)下的匯編工具雖然種類很多,但同 DOS/Windows 一樣,最基本的仍然是匯編器、連接器和調(diào)試器。

1.匯編器

匯編器(assembler)的作用是將用匯編語(yǔ)言編寫(xiě)的源程序轉(zhuǎn)換成二進(jìn)制形式的目標(biāo)代碼。Linux 平臺(tái)的標(biāo)準(zhǔn)匯編器是 GAS,它是 GCC 所依賴的后臺(tái)

匯編工具,通常包含在 binutils 軟件包中。GAS 使用標(biāo)準(zhǔn)的 AT&T 匯編語(yǔ)法,可以用來(lái)匯編用 AT&T 格式編寫(xiě)的程序:

[xiaowp@gary code]$ as -o hello.o hello.s

Linux 平臺(tái)上另一個(gè)經(jīng)常用到的匯編器是 NASM,它提供了很好的宏指令功能,并能夠支持相當(dāng)多的目標(biāo)代碼格式,包括 bin、a.out、coff、elf

、rdf 等。NASM 采用的是人工編寫(xiě)的語(yǔ)法分析器,因而執(zhí)行速度要比 GAS 快很多,更重要的是它使用的是 Intel 匯編語(yǔ)法,可以用來(lái)編譯用 Intel

語(yǔ)法格式編寫(xiě)的匯編程序:

[xiaowp@gary code]$ nasm -f elf hello.asm

2.鏈接器

由匯編器產(chǎn)生的目標(biāo)代碼是不能直接在計(jì)算機(jī)上運(yùn)行的,它必須經(jīng)過(guò)鏈接器的處理才能生成可執(zhí)行代碼。鏈接器通常用來(lái)將多個(gè)目標(biāo)代碼連接成一

個(gè)可執(zhí)行代碼,這樣可以先將整個(gè)程序分成幾個(gè)模塊來(lái)單獨(dú)開(kāi)發(fā),然后才將它們組合(鏈接)成一個(gè)應(yīng)用程序。 Linux 使用 ld 作為標(biāo)準(zhǔn)的鏈接程序,

它同樣也包含在 binutils 軟件包中。匯編程序在成功通過(guò) GAS 或 NASM 的編譯并生成目標(biāo)代碼后,就可以使用 ld 將其鏈接成可執(zhí)行程序了:

[xiaowp@gary code]$ ld -s -o hello hello.o

3.調(diào)試器

有人說(shuō)程序不是編出來(lái)而是調(diào)出來(lái)的,足見(jiàn)調(diào)試在軟件開(kāi)發(fā)中的重要作用,在用匯編語(yǔ)言編寫(xiě)程序時(shí)尤其如此。Linux 下調(diào)試匯編代碼既可以用

GDB、DDD 這類通用的調(diào)試器,也可以使用專門(mén)用來(lái)調(diào)試匯編代碼的 ALD(Assembly Language Debugger)。

從調(diào)試的角度來(lái)看,使用 GAS 的好處是可以在生成的目標(biāo)代碼中包含符號(hào)表(symbol table),這樣就可以使用 GDB 和 DDD 來(lái)進(jìn)行源碼級(jí)的調(diào)試

了。要在生成的可執(zhí)行程序中包含符號(hào)表,可以采用下面的方式進(jìn)行編譯和鏈接:

[xiaowp@gary code]$ as --gstabs -o hello.o hello.s

[xiaowp@gary code]$ ld -o hello hello.o

執(zhí)行 as 命令時(shí)帶上參數(shù) --gstabs 可以告訴匯編器在生成的目標(biāo)代碼中加上符號(hào)表,同時(shí)需要注意的是,在用 ld 命令進(jìn)行鏈接時(shí)不要加上 -s

參數(shù),否則目標(biāo)代碼中的符號(hào)表在鏈接時(shí)將被刪去。

在 GDB 和 DDD 中調(diào)試匯編代碼和調(diào)試 C 語(yǔ)言代碼是一樣的,你可以通過(guò)設(shè)置斷點(diǎn)來(lái)中斷程序的運(yùn)行,查看變量和寄存器的當(dāng)前值,并可以對(duì)代

碼進(jìn)行單步跟蹤。圖1 是在 DDD 中調(diào)試匯編代碼時(shí)的情景: 

Linux/匯編語(yǔ)言


圖1 用 DDD 中調(diào)試匯編程序。匯編程序員通常面對(duì)的都是一些比較苛刻的軟硬件環(huán)境,短小精悍的ALD可能更能符合實(shí)際的需要,因此下面主要介紹一下如何用ALD來(lái)調(diào)試匯編程

序。首先在命令行方式下執(zhí)行ald命令來(lái)啟動(dòng)調(diào)試器,該命令的參數(shù)是將要被調(diào)試的可執(zhí)行程序:

[xiaowp@gary doc]$ ald hello

Assembly Language Debugger 0.1.3

Copyright (C) 2000-2002 Patrick Alken

hello: ELF Intel 80386 (32 bit), LSB, Executable, Version 1 (current)

Loading debugging symbols...(15 symbols loaded)

ald>

當(dāng) ALD 的提示符出現(xiàn)之后,用 disassemble 命令對(duì)代碼段進(jìn)行反匯編:

ald> disassemble -s .text

Disassembling section .text (0x08048074 - 0x08048096)

08048074 BA0F000000 mov edx, 0xf

08048079 B998900408 mov ecx, 0x8049098

0804807E BB01000000 mov ebx, 0x1

08048083 B804000000 mov eax, 0x4

08048088 CD80 int 0x80

0804808A BB00000000 mov ebx, 0x0

0804808F B801000000 mov eax, 0x1

08048094 CD80 int 0x80

上述輸出信息的第一列是指令對(duì)應(yīng)的地址碼,利用它可以設(shè)置在程序執(zhí)行時(shí)的斷點(diǎn):

ald> break 0x08048088

Breakpoint 1 set for 0x08048088

斷點(diǎn)設(shè)置好后,使用 run 命令開(kāi)始執(zhí)行程序。ALD 在遇到斷點(diǎn)時(shí)將自動(dòng)暫停程序的運(yùn)行,同時(shí)會(huì)顯示所有寄存器的當(dāng)前值:

ald> run

Starting program: hello

Breakpoint 1 encountered at 0x08048088

eax = 0x00000004 ebx = 0x00000001 ecx = 0x08049098 edx = 0x0000000F

esp = 0xBFFFF6C0 ebp = 0x00000000 esi = 0x00000000 edi = 0x00000000

ds = 0x0000002B es = 0x0000002B fs = 0x00000000 gs = 0x00000000

ss = 0x0000002B cs = 0x00000023 eip = 0x08048088 eflags = 0x00000246

Flags: PF ZF IF

08048088 CD80 int 0x80

如果需要對(duì)匯編代碼進(jìn)行單步調(diào)試,可以使用 next 命令:

ald> next

Hello, world!

eax = 0x0000000F ebx = 0x00000000 ecx = 0x08049098 edx = 0x0000000F

esp = 0xBFFFF6C0 ebp = 0x00000000 esi = 0x00000000 edi = 0x00000000

ds = 0x0000002B es = 0x0000002B fs = 0x00000000 gs = 0x00000000

ss = 0x0000002B cs = 0x00000023 eip = 0x0804808F eflags = 0x00000346

Flags: PF ZF TF IF

0804808F B801000000 mov eax, 0x1

若想獲得 ALD 支持的所有調(diào)試命令的詳細(xì)列表,可以使用 help 命令:

ald> help

Commands may be abbreviated.

If a blank command is entered, the last command is repeated.

Type `help ' for more specific information on .

General commands

attach clear continue detach disassemble

enter examine file help load

next quit register run set

step unload window write

Breakpoint related commands

break delete disable enable ignore

lbreak tbreak

Linux操作系統(tǒng)是用C語(yǔ)言編寫(xiě)的,匯編只在必要的時(shí)候才被人們想到,但它卻是減少代碼尺寸和優(yōu)化代碼性能的一種非常重要的手段,特別是在與

硬件直接交互的時(shí)候,匯編可以說(shuō)是最佳的選擇。Linux提供了非常優(yōu)秀的工具來(lái)支持匯編程序的開(kāi)發(fā),,使用GCC的內(nèi)聯(lián)匯編能夠充分地發(fā)揮C語(yǔ)言和匯

編語(yǔ)言各自的優(yōu)點(diǎn)。

【編輯推薦】

【責(zé)任編輯:高圓圓 TEL:(010)68476606】


原文:Linux下的匯編語(yǔ)言之匯編工具 返回操作系統(tǒng)首頁(yè)



本文編號(hào):623947

資料下載
論文發(fā)表

本文鏈接:http://www.sikaile.net/wenshubaike/dxkc/623947.html


Copyright(c)文論論文網(wǎng)All Rights Reserved | 網(wǎng)站地圖 |

版權(quán)申明:資料由用戶ac186***提供,本站僅收錄摘要或目錄,作者需要?jiǎng)h除請(qǐng)E-mail郵箱bigeng88@qq.com