|
|
转自:http://www.ibm.com/developerwork ... &S_CMP=techcsdn
- T5 U# `5 L. Y' B; e" F6 k) X7 v
, P2 b- A- @7 A$ \( T7 K& ~" S2 RLinux 汇编器:对比 GAS 和 NASM (见附件); B, t) z ^* r0 L" x" I2 g! H# K
对比 GNU Assembler(GAS)和 Netwide Assembler(NASM); b$ r: G& ] K+ \6 B c
Ram Narayam (rnaraya2@in.ibm.com), 软件工程师, IBM5 a, o7 a k4 h# q0 e5 x8 q
) }/ x: R* \- k/ R9 v
, p& u- g t: g; h: T2007 年 11 月 05 日
9 W, ?8 b# v7 _) ]/ Y! o, [/ W" b' {0 s% J1 C) h1 X9 {8 f: O5 ^ M
本文解释两种最流行的 Linux® 汇编器 —— GNU Assembler(GAS)和 Netwide Assembler(NASM) —— 之间一些比较重要的语法差异和语义差异,包括基本语法、变量和内存访问、宏处理、函数和外部例程、堆栈处理以及重复执行代码块的技术方面的差异。
. d; v! ^3 v+ j4 K# V2 r Y与其他语言不同,汇编语言要求开发人员了解编程所用机器的处理器体系结构。汇编程序不可移植,维护和理解常常比较麻烦,通常包含大量代码行。但是,在机器上执行的运行时二进制代码在速度和大小方面有优势。 7 s& J+ w8 S- t& X; o, @6 Z
: f; @$ f) H4 f4 I- E( h6 s3 ?$ \2 n4 p
对于在 Linux 上进行汇编级编程已经有许多参考资料,本文主要讲解语法之间的差异,帮助您更轻松地在汇编形式之间进行转换。本文源于我自己试图改进这种转换的尝试。 ; m; y3 q1 b9 V+ z7 x
9 d/ c# G, e4 V4 Y4 p! |6 N本文使用一系列程序示例。每个程序演示一些特性,然后是对语法的讨论和对比。尽管不可能讨论 NASM 和 GAS 之间存在的每个差异,但是我试图讨论主要方面,给进一步研究提供一个基础。那些已经熟悉 NASM 和 GAS 的读者也可以在这里找到有用的内容,比如宏。
2 S$ W, C7 l& [- D/ m3 S# L3 {
7 S( E7 o# K6 q) W) o$ b本文假设您至少基本了解汇编的术语,曾经用符合 Intel® 语法的汇编器编写过程序,可能在 Linux 或 Windows 上使用过 NASM。本文并不讲解如何在编辑器中输入代码,或者如何进行汇编和链接(但是下面的边栏可以帮助您 快速回忆一下)。您应该熟悉 Linux 操作系统(任何 Linux 发行版都可以;我使用的是 Red Hat 和 Slackware)和基本的 GNU 工具,比如 gcc 和 ld,还应该在 x86 机器上进行编程。
2 F% G; L/ o6 w5 x/ N2 L8 b& G) t
. y" k( Q8 y9 l2 k3 T; P, V现在,我描述一下本文讨论的范围。! C, l3 O$ ^6 p7 ~
2 s. {4 p# u# \; D; {( t本文讨论: 1 ]7 q% A1 V2 s- Y) t1 v
7 o5 r# o# W; z
NASM 和 GAS 之间的基本语法差异 0 z2 i$ N% Y. n- t1 x, i$ B8 Q2 D
常用的汇编级结构,比如变量、循环、标签和宏
0 E! s/ |* b9 X" [: V n关于调用外部 C 例程和使用函数的信息 1 @7 g8 w4 Z/ r6 }
汇编助记符差异和使用方法
5 \; @8 @0 P8 x- _3 Y, {+ Y内存寻址方法
' w4 A2 H" D9 x! k! v) Y
- |- S8 d( z @+ P! n; k本文不讨论:8 }: g( E" e& f3 k6 X, Y0 y" q1 J9 d7 j
[4 @6 W7 G: a' d0 I( b* g处理器指令集
5 l0 @ E! p5 t& k1 n. \一种汇编器特有的各种宏形式和其他结构 . c; R3 B* x7 u# v
NASM 或 GAS 特有的汇编器指令
; ^! v$ P, o! c不常用的特性,或者只在一种汇编器中出现的特性 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?加入计匠网
×
|