![我的汇编学习之路(1):指令_第1页](http://file3.renrendoc.com/fileroot_temp3/2021-12/14/a18491d3-af60-4565-9d3c-b6eec09fe2fd/a18491d3-af60-4565-9d3c-b6eec09fe2fd1.gif)
![我的汇编学习之路(1):指令_第2页](http://file3.renrendoc.com/fileroot_temp3/2021-12/14/a18491d3-af60-4565-9d3c-b6eec09fe2fd/a18491d3-af60-4565-9d3c-b6eec09fe2fd2.gif)
![我的汇编学习之路(1):指令_第3页](http://file3.renrendoc.com/fileroot_temp3/2021-12/14/a18491d3-af60-4565-9d3c-b6eec09fe2fd/a18491d3-af60-4565-9d3c-b6eec09fe2fd3.gif)
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、引言我们很多人是开发者,每天写大量的代码,有时也不是糟糕的代码。每个人都能很轻松写下这样的代码:#include <stdio.h>int main() int x = 10;int y = 100;printf("x + y = %d", x + y);return 0;大家都能理解上面这段C 语言代码完成的功能,但是这段代码底层是如何工作的呢?我想我们中间不是所有人都能回答这个问题,我也不能。 我认为我可以用高级编程语言写代码,例如 Haskell 、Erlang 、Go 等等,但是我完全不知道在编译之后它在底层是如何工作的。所以,我决定往下
2、再深入一步,到汇编这个层次,并且记录下我的学习汇编之路。希望这是有趣的过程,而不是仅仅对我一个人。大约五、 六年前我已经使用过汇编来写简单的程序,那时我还在上大学, 用的是Turbo 汇编和DOS 操作系统。 现在我使用Linux-x86_64操作系统,是的,64 位 Linux和 16 位 DOS 肯定有很大的不同。那我们就开始吧。准备阶段在开始之前,我们需要准备一些我接下来要提到的东西。我使用的是Ubuntu(Ubuntu位 ) 系统,因此我的文章都是基于该操作系统和体系结构的。不同的CPU 支持不同的指令集,我使用的是Intel Core i7 870处理器,所有代码都在这上面运行。另外
3、我将用nasm 汇编,你可以用下面命令来安装:sudo apt-get install nasmI 它的版本应该是或者更高了。我是用的是2013年12 月29 日编译的NASM版本。最后一部分,你需要一款写汇编代码的文本编辑器,我使用配有 nasm-mode.el 的 Emacs 编辑器。 当然这不是强制性的, 你可以选择任何你喜欢的文本编辑器。如果你像我一样使用的是 Emacs,你可以下载 nasm-mode.el,将你的 Emacs 配置成这样:(load "/.emacs.d/lisp/nasm.el")(require 'nasm-mode)(add-to-
4、list 'auto-mode-alist '(".(asm|s)$" . nasm-mode)这就是目前我们需要准备的所有东西,其它工作在接下来的文章中会提到。x64 语法这里我就不全面介绍汇编的语法了, 我们仅提一下这篇文章中用到的语法。 通常 NASM 程序会被划分为不同的段( section),这篇文章中我们会涉及到两个段:数据段( data section)代码段( text section)数据段用来定义常量( constant),常量是在运行时不会改变的数据。你可以定义数字或其他常量等等,声明一个数据段的语法如下:section .data代码
5、段是存放代码( code)的,该段必须以 global_start 开始,告诉内核这里是程序开始执行的地方。section .textglobal _start_start:注释是以; 开始。每个NASM代码行包含下面四个字段的组合:label: instruction operands ; comment中括号括起来的字段表示是可选的。基本NASM指令由两部分组成,执行指令的名字,第二部分是该指令的操作数。例如:MOV COUNT, 48 ; 将数值48 存放到COUNT变量中Hello world第一部分是需要让我们用NASM汇编来写第一个程序吧,当然是传统的打印“ Hello world
6、” 的程序。这是代码:section .datamsg db "hello, world!"section .textglobal _start_start:mov rax, 1mov rdi, 1mov rsi, msgmov rdx, 13syscallmov rax, 60mov rdi, 0syscall的,看起来不像printf( “ Helloworld ” ),我们试着去理解它是什么、怎么工作的。先看 1-2 行,我们定义了一个数据段,并且有一个msg 常量,值为Helloworld ,那么我们就可以在代码中使用这个常量了。下一步是定义了一个代码段,以及程序的
7、入口,代码从第7 行开始执行。现在到了程序最有意思的部分了。我们已经了解了mov 指令的功能,它带有两个操作数,将第二个操作数的值放到第一个操作数中。但是,rax、rdi 等等这些是什么呢?我们找到维基百科的解释:中央处理单元(CPU)是计算机中的硬件,它读取计算机程序中的指令,完成系统中基本的算术、逻辑、输入/输出操作。好了, CPU 完成一些操作,例如算术操作等,但是它从哪获得操作的数据呢?第一个答案是内存。 然而从内存中读取和存入数据的速度远远低于处理器的速度,它涉及到复杂的通过控制总线来发送数据请求的过程。因此,CPU 有其内部的存储位置,称为寄存器(register )。x64_re
8、gisters那么我们写mov rax, 1,意思是将1 放到rax寄存器中。现在我们知道什么是rax、rdi 、 rbx 等等了吧,但是还需要知道什么时候使用rax,什么时候使用rsirax 临时寄存器,当我们调用系统调用时,rax 保存系统调用号rdx 用来向函数传递第三个参数rdi 用来向函数传递第一个参数rsi 用来向函数传递第二个参数的指针换句话说,我们就是调用了sys_write 系统调用,该函数原型是:等等。ssize_t sys_write(unsigned int fd, const char *buf, size_t count)它有三个参数:fd 文件描述符, 0、 1、
9、2 分别代表标准输入、标准输出和标准错误buf 字符数组的指针,用来保存从fd 指向的文件中获取的内容count 表示要从文件中读入到字符数组的字节数我们知道sys_write 系统调用带有三个参数,它在系统调用表中有一个系统调用号。我们再看看程序的实现,将1 放到rax 寄存器中,它意思是我们使用sys_write 系统调用;下一行将1 存到rdi 寄存器,它是sys_write 的第一个参数,1 代表标准输出;然后我们将msg 的指针存到rsi 寄存器中,这是sys_write的第二个参数buf ;接着我们传递sys_write 最后一个参数(字符串的长度)到 rdx 寄存器中。现在,我们有了 sys_write 的所有参数, 就可以在 11 行使用 syscall 来调用它了。 好了,我们打印出 “Hello world ” 字符串,现在需要从程序中正确退出。我们传递 60 到 rax 寄存器, 60 是 exit 的系统调用号;以及将 0 传递给 rdi 寄存器,这是错误码, 0 表示我们的程序正确地退出。这就是 “ Hello world ” 的所有分析,相当简单吧 :) 现在我们编译程序,假设我们的程序放在hello.asm文件中,那么我们需要运行下面的命令来执行:nasm -f elf64 -o hello.o hello.asmld
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年度淘宝店铺人工智能客服合作协议
- 2025-2030年增肌塑形添加剂行业深度调研及发展战略咨询报告
- 剧场舞台灯光自动化控制技术考核试卷
- 2025-2030年手绘地图制作行业深度调研及发展战略咨询报告
- 2025-2030年手绘风景明信片套装行业深度调研及发展战略咨询报告
- 搪瓷制品在电力电气中的应用考核试卷
- 农药产品的市场风险防范考核试卷
- 法制宣传主题教育活动总结12篇
- 二零二五年度北京医疗设备行业劳动合同法律顾问服务合同
- 美食广场室内设计合同样本
- 分析化学(高职)PPT完整版全套教学课件
- 晚熟的人(莫言诺奖后首部作品)
- m拱顶储罐设计计算书
- 2023外贸业务协调期中试卷
- 新人教鄂教版(2017)五年级下册科学全册教学课件
- GB/T 29361-2012电子物证文件一致性检验规程
- GB/T 16475-1996变形铝及铝合金状态代号
- 上海铁路局劳动安全“八防”考试题库(含答案)
- 效率提升和品质改善方案
- 义务教育学科作业设计与管理指南
- 物业客服培训PPT幻灯片课件(PPT 61页)
评论
0/150
提交评论