我的汇编学习之路(1):指令.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多

引言

我们很多人是开发者,每天写大量的代码,有时也不是糟糕的代码。每个人都能很轻松写下这样的代码:

#includelt;stdio.hgt;

intmain(){

intx=10;

inty=100;

printf(x+y=%d,x+y);

return0;

}

大家都能理解上面这段C语言代码完成的功能,但是…这段代码底层是如何工作的呢?我想我们中间不是所有人都能回答这个问题,我也不能。我认为我可以用高级编程语言写代码,例如Haskell、Erlang、Go等等,但是我完全不知道在编译之后它在底层是如何工作的。所以,我决定往下再深入一步,到汇编这个层次,并且记录下我的学习汇编之路。希望这是有趣的过程,而不是仅仅对我一个人。大约五、六年前我已经使用过汇编来写简单的程序,那时我还在上大学,用的是Turbo汇编和DOS操作系统。现在我使用Linux-x86_64操作系统,是的,64位Linux和16位DOS肯定有很大的不同。那我们就开始吧。

准备阶段

在开始之前,我们需要准备一些我接下来要提到的东西。我使用的是Ubuntu(Ubuntu14.04.1LTS64位)系统,因此我的文章都是基于该操作系统和体系结构的。不同的CPU支持不同的指令集,我使用的是IntelCorei7870处理器,所有代码都在这上面运行。另外我将用nasm汇编,你可以用下面命令来安装:

sudoapt-getinstallnasm

I它的版本应该是2.0.0或者更高了。我是用的是2013年12月29日编译的NASMversion2.10.09版本。最后一部分,你需要一款写汇编代码的文本编辑器,我使用配有nasm-mode.el的Emacs编辑器。当然这不是强制性的,你可以选择任何你喜欢的文本编辑器。如果你像我一样使用的是Emacs,你可以下载nasm-mode.el,将你的Emacs配置成这样:

(load~/.emacs.d/lisp/nasm.el)

(requirenasm-mode)

(add-to-listauto-mode-alist(.(asm|s)$.nasm-mode))

这就是目前我们需要准备的所有东西,其它工作在接下来的文章中会提到。

x64语法

这里我就不全面介绍汇编的语法了,我们仅提一下这篇文章中用到的语法。通常NASM程序会被划分为不同的段(section),这篇文章中我们会涉及到两个段:

数据段(datasection)

代码段(textsection)

数据段用来定义常量(constant),常量是在运行时不会改变的数据。你可以定义数字或其他常量等等,声明一个数据段的语法如下:

section.data

代码段是存放代码(code)的,该段必须以global_start开始,告诉内核这里是程序开始执行的地方。

section.text

global_start

_start:

注释是以;开始。每个NASM代码行包含下面四个字段的组合:

[label:]instruction[operands][;comment]

中括号括起来的字段表示是可选的。基本NASM指令由两部分组成,第一部分是需要执行指令的名字,第二部分是该指令的操作数。例如:

MOVCOUNT,48;将数值48存放到COUNT变量中

Helloworld

让我们用NASM汇编来写第一个程序吧,当然是传统的打印“Helloworld”的程序。这是代码:

section.data

msgdbhello,world!

section.text

global_start

_start:

movrax,1

movrdi,1

movrsi,msg

movrdx,13

syscall

movrax,60

movrdi,0

syscall

的,看起来不像printf(“Helloworld”),我们试着去理解它是什么、怎么工作的。先看1-2行,我们定义了一个数据段,并且有一个msg常量,值为Helloworld,那么我们就可以在代码中使用这个常量了。下一步是定义了一个代码段,以及程序的入口,代码从第7行开始执行。现在到了程序最有意思的部分了。我们已经了解了mov指令的功能,它带有两个操作数,将第二个操作数的值放到第一个操作数

文档评论(0)

ppptttt6774 + 关注
实名认证
文档贡献者

2222

1亿VIP精品文档

相关文档