Linux内核中常用的汇编.docx

  1. 1、本文档共5页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Linux内核中常用的汇编 [日期:2009-12-15]来源:CSDN [日期:2009-12-15] rmirenmT 丁 汇编语言的相关知识 在Linux源代码中,以.S 在Linux源代码中,以.S为扩展名的文件是 相关知识。 和连接程序1 . GNU 汇编程序 GAS ( GNU Assembly 和连接程序 当你编写了一个程序后,就需要对其进行汇编(assembly )和连接。在 Linux下有两种方式,一种是使用汇编程序 GAS和 当你编写了一个程序后,就需要对其进行汇编( 连接程序ld,一种是使用gcc。我们先来看一下 GAS和ld: GAS把汇编语言源文件(.0 )转换为目标文件(Q ),其基本语法如下: as filename.s -o filename.o 一旦创建了一个目标文件,就需要把它连接并执行,连接一个目标文件的基本语法为: ld file name.o -o file name 这里filename.o是目标文件名,而filename是输出(可执行)文件。 GAS使用的是ATT的语法而不是In tel的语法,这就再次说明了 ATT语法是Un ix世界的标准,你必须熟悉它。 如果要使用 GNC的C编译器gcc,就可以一步完成汇编和连接,例如: gcc -o example example.S 这里,example.S是你的汇编程序,输出文件(可执行文件)名为 example。其中,扩展名必须为大写的 S,这是因为,大 写的S可以使gcc自动识别汇编程序中的 C预处理命令,像#include 、#define、#ifdef、#endif等,也就是说,使 用gcc进行编译,你可以在汇编程序中使用 C的预处理命令。 2. ATT 中的节(Section ) 在ATT的语法中,一个节由.section关键词来标识,当你编写汇编语言程序时,至少需要有以下三种节: .section .data :这种节包含程序已初始化的数据,也就是说,包含具有初值的那些变量,例如: hello : .string Hello world!\n hello_len : .long 13 .secti on .bss :这个节包含程序还未初始化的数据,也就是说,包含没有初值的那些变量。当操作 系统装入这个程序时将把这些变量都置为 0,例如: name : .fill 30 #用来请求用户输入名字 name_len : .Iong 0 #名字的长度(尚未定义) 当这个程序被装入时, name和name_len都被置为0。如果你在.bss节不小心给一个变量赋了初值,这个值也会丢失, 并且变量的值仍为 0。 使用.bss比使用.data的优势在于,.bss节不占用磁盘的空间。在磁盘上,一个长整数就足以存放 .bss节。当程序被装入 到内存时,操作系统也只分配给这个节 4个字节的内存大小。 注意:编译程序把.data和.bss在4字节上对齐(align ),例如,.data总共有34字节,那么编译程序把它对其在 36 字节上,也就是说,实际给它 36字节的空间。 .section .text :这个节包含程序的代码,它是只读节,而 .data和.bss是读/写节。 Linux内核中常用的汇编 [日期:2009-12-15] 来源:CSDN 作者:dylan 3 .汇编程序指令( Assembler Directive ) 上面介绍的.section就是汇编程序指令的一种, GNU汇编程序提供了很多这样的指令 (directiv ),这种指令都是以句点(. )为开头,后跟指令名(小写字母),在此,我们只介绍在内核源代码中出现的几个指令(以 arch/i386/kernel/head.S 中的 代码为例)。 (1 ) ascii stri ng... .ascii表示零个或多个(用逗号隔开)字符串,并把每个字符串(结尾不 自动加“0字节)中的字符放在连续的地址单元。 还有一个与.ascii类似的.asciz , z代表“0 “即每个字符串结尾自动加一个” 0字节,例如: in t_msg: .asciz Unknown in terrupt\n (2 ) .byte 表达式 .byte表示零或多个表达式(用逗号隔开),每个表达式被放在下一个字节单元。 (3 ) .fill表达式 形式:.fill repeat , size , value其中,repeat、 size禾廿value都是常量表达式。Fill的含义是反复拷贝 size个字节。Repeat可以大于等于 0。size也可以大于等于 0,但不能超过 8,如果超过8,也只取8。把repeat个字节以8个为一组,每组的最高 4个字节内容为0,最低4字节内容置为value。Size禾廿v

文档评论(0)

niupai11 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档