成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

運維 系統運維
匯編語言是基本的語言之一,他的明顯優勢是速度快,可以直接對硬件進行操作。Linux下如何使用匯編語言,語法格式有哪些?需要使用哪些開發工具?本文將會為大家詳細道來。

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

第二課時: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 采用的是人工編寫的語法分析器,因而執行速度要比 GAS 快很多,更重要的是它使用的是 Intel 匯編語法,可以用來編譯用 Intel

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

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

  2.鏈接器

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

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

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

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

  3.調試器

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

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

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

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

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

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

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

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

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

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

Linux/匯編語言


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

序。首先在命令行方式下執行ald命令來啟動調試器,該命令的參數是將要被調試的可執行程序:

  [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 的提示符出現之后,用 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

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

  ald> break 0x08048088

  Breakpoint 1 set for 0x08048088

  斷點設置好后,使用 run 命令開始執行程序。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操作系統是用C語言編寫的,匯編只在必要的時候才被人們想到,但它卻是減少代碼尺寸和優化代碼性能的一種非常重要的手段,特別是在與

硬件直接交互的時候,匯編可以說是***的選擇。Linux提供了非常優秀的工具來支持匯編程序的開發,使用GCC的內聯匯編能夠充分地發揮C語言和匯

編語言各自的優點。
 

【編輯推薦】

  1. 2.3 用匯編語言編寫程序
  2. 術語匯編 基本CSS濾鏡概述
  3. 琢石成器—Windows環境下32位匯編語言程序設計
  4. 3.1.3 as86匯編語言程序的編譯和鏈接
  5. 3.1.2 as86匯編語言程序
  6. 3.1.1 as86匯編語言語法
  7. 3.2.6 as匯編命令

 

責任編輯:zhaolei 來源: 網絡轉載
相關推薦

2011-01-14 14:39:32

Linux匯編語言

2011-01-14 14:15:11

Linux匯編語言

2011-01-14 14:22:50

Linux匯編語言

2011-01-14 13:44:45

Linux匯編語言

2012-02-09 09:00:54

匯編語言

2021-03-25 13:05:56

網絡安全寄存器匯編語言

2010-11-09 09:51:52

匯編語言

2021-06-11 10:02:39

語言編程開發

2018-01-11 14:58:40

2011-01-04 17:08:10

匯編語言

2022-10-31 14:02:24

匯編語言神經網絡

2023-11-23 08:25:40

開發人員SmaliAndroid

2017-01-12 22:36:30

2011-07-21 09:59:26

JavaScript

2023-06-01 16:27:34

匯編語言函數

2022-03-25 21:57:49

匯編Go語言

2010-07-13 10:21:19

2010-06-10 18:27:00

UML語言

2010-08-10 10:32:02

Flex語言

2020-12-18 08:49:11

相對跳轉絕對跳轉指令
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产在线精品一区二区 | 在线不卡一区 | 好好的日在线视频 | 欧美二区乱c黑人 | 99精品视频免费在线观看 | 午夜精品久久久久久久星辰影院 | 国产激情视频在线 | 涩涩鲁亚洲精品一区二区 | chengrenzaixian| 欧洲免费视频 | 97精品久久| 综合色在线 | av一区二区三区四区 | 欧美精品一区二区三区四区五区 | 精品视频久久久久久 | 欧美在线观看一区 | 国产精品久久久爽爽爽麻豆色哟哟 | 久久艹免费视频 | 天天av网| 国产视频精品区 | 91精品一区二区三区久久久久 | 日日操操 | 亚洲一区| 免费观看一级特黄欧美大片 | a免费视频 | 国产精品一区二区福利视频 | 91国自视频 | 天天操操 | 97视频在线观看网站 | 国产一级免费视频 | 在线观看第一区 | 成人在线精品视频 | 碰碰视频 | 国产精品国产三级国产aⅴ中文 | 天堂资源| 天天干免费视频 | 国产精品久久久久久久久久久久冷 | 日韩欧美一级精品久久 | 国产性网 | 中文字幕免费视频 | 久久精品国产亚洲 |