- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
FreeBSD x86汇编语言
第11章 x86 汇编语言 目录 11.1 概述 11.2 工具 11.3 系统调用 11.4 返回值 11.5 建立可移植的代码 11.6 编写第一个程序 11.7 编写 UNIX? 过滤程序 11.8 缓存 I/O 11.9 Command Line Arguments 11.10 UNIX? 中的环境 11.11 文件处理 11.12 One-Pointed Mind 11.13 Using the FPU 11.14 忠告 11.15 致谢 本章节由 G. Adam Stanislav adam@ 撰写。 翻译: sunlecn@。 11.1 概述 涉及 UNIX 下的汇编语言的相关资料很少。 通常我们都假设几乎没有人希望用到它,因为不同的 UNIX 可能是在不同的处理器上运行的, 所以为了移植性的考虑所有的东西都应该用 C 来实现。 实际上, C 语言的移植性是非常神秘的。即使 C 程序在不同的 UNIX? 之间移植的时候需要进行修改,但这些修改绝对和在什么处理器上运行无关。 特别明显地是,这样的程序充满了在编译时对于系统依赖的条件描述。 即使我们希望所有的 UNIX 软件都应该用 C 语言或者是其他的高级语言编写, 但是我们仍然需要掌握汇编语言的程序员: 不然谁将完成 C 语言函数库中直接访问内核的部分? 在本章节,我将尝试着说明如果用汇编语言编写 UNIX 程序,特别是在 FreeBSD 上的程序。 这个章节不会讲解汇编语言的基础知识。现在已经有很多相关的资料了(如果你想寻找完整的关于汇编语言的在线课程, 请看 Randall Hyde 的 《汇编语言艺术》;如果你想选择一本书, 那么去看看 Jeff Duntemann 的 《循序渐进学汇编》) 不过, 一旦你掌握了这个章节的内容,任何汇编语言的程序员, 将能够在 FreeBSD 上高效、快速地编写程序。 11.2 工具 11.2.1 汇编器 汇编语言编程最重要的工具是汇编器, 它将汇编语言代码转换成机器语言。 在 FreeBSD 中有两个完全不同的汇编器。 一个是 as(1), 使用传统的UNIX汇编语法, 它是随系统发布的。 另外一个是 /usr/ports/devel/nasm。 它使用 Intel 的语法规范, 其最大的好处是可以在许多操作系统上汇编代码。 它需要你单独安装,不过它是完全免费的。 本章节使用 nasm 的语法规范,这是因为许多从其他操作系统移植到 FreeBSD 的汇编语言可以更好地被理解。 不过, 坦白地说,这是因为我更习惯这样的语法规范。 11.2.2 连接器 像任何编译器一样, 汇编器的输出需要被连接后才能成为可执行文件。 标准的连接器 ld(1) 随 FreeBSD 发布。 它可以和以上任何一个汇编器一起完成代码组装。 11.3 系统调用 11.3.1 默认的调用规范 通常, FreeBSD 的内核使用 C 语言的调用规范。 此外, 虽然我们使用 int 80h 来访问内核, 但是我们常常通过调用一个函数来执行 int 80h, 而不是直接访问。 这个规范是非常方便的, 比 Microsoft? 的 MS-DOS? 上使用的规范更加优越。 为什么呢? 因为 UNIX? 的规范允许任何语言所写的程序访问内核。 汇编语言也可以这样做, 比如, 我们可以编写一个文件: kernel: int 80h ; Call kernel ret open: push dword mode push dword flags push dword path mov eax, 5 call kernel add esp, byte 12 ret 这是一种非常清晰而易于移植的编码方法。 如果你需要将代码移植到一个使用和 FreeBSD 完全不同中断或参数传递方式的 UNIX 系统,那么你所需要做的仅仅是改变那一段内核程序。 但是汇编程序员喜欢使用一些技巧来削减程序执行所需的时钟周期数。 以上的例子需要一个 call/ret 组合, 我们可以通过压栈 push 一个额外的双字节来去除它。 open: push dword mode push dword flags push dword path mov eax, 5 push eax ; Or any other dword int 80h add esp, byte 16 在上一个 open 的例子中, 我们放在 E
文档评论(0)