鱼C论坛

 找回密码
 立即注册
查看: 1498|回复: 0

[技术交流] AT&T汇编语言的相关知识

[复制链接]
发表于 2013-12-13 10:28:44 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
Linux
源代码中,以
.S
为扩展名的文件是“纯”汇编语言的文件。这里,我们结合具体的例子再介绍一些
AT&T
汇编语言的相关知识。



1.GNU汇编程序GAS(GNU Assembly和连接程序

当你编写了一个程序后,就需要对其进行汇编(assembly)和连接。在Linux下有两种方式,一种是使用汇编程序GAS和连接程序ld,一种是使用gcc。我们先来看一下GAS和ld:

GAS把汇编语言源文件(.o)转换为目标文件(.o),其基本语法如下:

as filename.s -o filename.o

一旦创建了一个目标文件,就需要把它连接并执行,连接一个目标文件的基本语法为:

ld filename.o -o filename

这里 filename.o是目标文件名,而filename 是输出(可执行) 文件。

GAS使用的是AT&T的语法而不是Intel的语法,这就再次说明了AT&T语法是Unix世界的标准,你必须熟悉它。

如果要使用GNC的C编译器gcc,就可以一步完成汇编和连接,例如:

gcc -o example example.S

这里,example.S是你的汇编程序,输出文件(可执行文件)名为example。其中,扩展名必须为大写的S,这是因为,大写的S可以使gcc自动识别汇编程序中的C预处理命令,像#include、#define、#ifdef、 #endif等,也就是说,使用gcc进行编译,你可以在汇编程序中使用C的预处理命令。


2. AT&T中的节(Section)在AT&T的语法中,一个节由.section关键词来标识,当你编写汇编语言程序时,至少需要有以下三种节:.section .data: 这种节包含程序已初始化的数据,也就是说,包含具有初值的那些变量,例如:hello : .string "Hello world!/n"hello_len : .long 13.section .bss:这个节包含程序还未初始化的数据,也就是说,包含没有初值的那些变量。当操作系统装入这个程序时将把这些变量都置为0,例如:
name : .fill 30 # 用来请求用户输入名字name_len : .long 0 # 名字的长度 (尚未定义)当这个程序被装入时,name 和 name_len都被置为0。如果你在.bss节不小心给一个变量赋了初值,这个值也会丢失,并且变量的值仍为0。使用.bss比使用.data的优势在于,.bss节不占用磁盘的空间。在磁盘上,一个长整数就足以存放.bss节。当程序被装入到内存时,操作系统也只分配给这个节4个字节的内存大小。注意:编译程序把.data和.bss在4字节上对齐(align),例如,.data总共有34字节,那么编译程序把它对其在36字节上,也就是说,实际给它36字节的空间。.section .text :这个节包含程序的代码,它是只读节,而.data 和.bss是读/写节。


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-17 16:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表