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

當前位置:主頁 > 論文百科 > 大學課程 >

Linux下的匯編語言之匯編工具

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

  本文關鍵詞:匯編語言


  更多相關文章: Linux 匯編語言


作為最基本的編程語言之一,匯編語言雖然應用的范圍不算很廣,但重要性卻勿庸置疑,因為它能夠完成許多其它語言所無法完成的功能。就拿 Linux 內核來講,雖然絕大部分代碼是用 C 語言編寫的,但仍然不可避免地在某些關鍵地方使用了匯編代碼,其中主要是在 Linux 的啟動部分。由于這部分代碼與硬件的關系非常密切,即使是 C 語言也會有些力不從心,而匯編語言則能夠很好揚長避短,最大限度地發(fā)揮硬件的性能。

第二課時:Linux 匯編工具

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

1.匯編器

匯編器(assembler)的作用是將用匯編語言編寫的源程序轉換成二進制形式的目標代碼。Linux 平臺的標準匯編器是 GAS,它是 GCC 所依賴的后臺

匯編工具,通常包含在 binutils 軟件包中。GAS 使用標準的 AT&T 匯編語法,可以用來匯編用 AT&T 格式編寫的程序:

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

Linux 平臺上另一個經常用到的匯編器是 NASM,它提供了很好的宏指令功能,并能夠支持相當多的目標代碼格式,包括 bin、a.out、coff、elf

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

語法格式編寫的匯編程序:

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

2.鏈接器

由匯編器產生的目標代碼是不能直接在計算機上運行的,它必須經過鏈接器的處理才能生成可執(zhí)行代碼。鏈接器通常用來將多個目標代碼連接成一

個可執(zhí)行代碼,這樣可以先將整個程序分成幾個模塊來單獨開發(fā),然后才將它們組合(鏈接)成一個應用程序。 Linux 使用 ld 作為標準的鏈接程序,

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

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

3.調試器

有人說程序不是編出來而是調出來的,足見調試在軟件開發(fā)中的重要作用,在用匯編語言編寫程序時尤其如此。Linux 下調試匯編代碼既可以用

GDB、DDD 這類通用的調試器,也可以使用專門用來調試匯編代碼的 ALD(Assembly Language Debugger)。

從調試的角度來看,使用 GAS 的好處是可以在生成的目標代碼中包含符號表(symbol table),這樣就可以使用 GDB 和 DDD 來進行源碼級的調試

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

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

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

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

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

在 GDB 和 DDD 中調試匯編代碼和調試 C 語言代碼是一樣的,你可以通過設置斷點來中斷程序的運行,查看變量和寄存器的當前值,并可以對代

碼進行單步跟蹤。圖1 是在 DDD 中調試匯編代碼時的情景: 

Linux/匯編語言


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

序。首先在命令行方式下執(zhí)行ald命令來啟動調試器,該命令的參數(shù)是將要被調試的可執(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>

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

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

上述輸出信息的第一列是指令對應的地址碼,利用它可以設置在程序執(zhí)行時的斷點:

ald> break 0x08048088

Breakpoint 1 set for 0x08048088

斷點設置好后,使用 run 命令開始執(zhí)行程序。ALD 在遇到斷點時將自動暫停程序的運行,同時會顯示所有寄存器的當前值:

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

如果需要對匯編代碼進行單步調試,可以使用 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 支持的所有調試命令的詳細列表,可以使用 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ōu)化代碼性能的一種非常重要的手段,特別是在與

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

編語言各自的優(yōu)點。

【編輯推薦】

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


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



本文編號:623947

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

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


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

版權申明:資料由用戶ac186***提供,本站僅收錄摘要或目錄,作者需要刪除請E-mail郵箱bigeng88@qq.com
国产一区国产二区在线视频| 亚洲精品中文字幕一二三| 亚洲黄片在线免费小视频| 日本欧美视频在线观看免费| 国产专区亚洲专区久久| 国产91人妻精品一区二区三区| 国产麻豆一区二区三区在| 亚洲天堂精品一区二区| 欧美同性视频免费观看| 高清国产日韩欧美熟女| 免费在线成人激情视频| 免费在线观看激情小视频| 黄片三级免费在线观看| 亚洲深夜精品福利一区| 亚洲精品偷拍视频免费观看| 果冻传媒精选麻豆白晶晶| 欧美日韩国产免费看黄片| 人人爽夜夜爽夜夜爽精品视频| 国产精品免费无遮挡不卡视频| 99久久人妻精品免费一区| 熟女少妇久久一区二区三区| 精品人妻一区二区三区四区久久| 国产黄色高清内射熟女视频| 欧美一区二区在线日韩| 国产在线小视频你懂的| 国产视频一区二区三区四区| 富婆又大又白又丰满又紧又硬| 一区二区福利在线视频| 美女被后入福利在线观看| 日韩精品小视频在线观看| 99久久国产精品亚洲| 色婷婷亚洲精品综合网| 日韩在线视频精品视频| 四十女人口红哪个色好看| 亚洲男人的天堂色偷偷| 1024你懂的在线视频| 日韩成人免费性生活视频| 亚洲熟女诱惑一区二区| 日韩欧美中文字幕av| 美国女大兵激情豪放视频播放| 国产一区二区三区草莓av|