ImageVerifierCode 换一换
格式:DOC , 页数:3 ,大小:20.50KB ,
资源ID:9724670      下载积分:5 金币
快捷注册下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

开通VIP
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.zixin.com.cn/docdown/9724670.html】到电脑端继续下载(重复下载【60天内】不扣币)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

开通VIP折扣优惠下载文档

            查看会员权益                  [ 下载后找不到文档?]

填表反馈(24小时):  下载求助     关注领币    退款申请

开具发票请登录PC端进行申请

   平台协调中心        【在线客服】        免费申请共赢上传

权利声明

1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:0574-28810668;投诉电话:18658249818。

注意事项

本文(我的汇编学习之路(1):指令.doc)为本站上传会员【精***】主动上传,咨信网仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知咨信网(发送邮件至1219186828@qq.com、拔打电话4009-655-100或【 微信客服】、【 QQ客服】),核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载【60天内】不扣币。 服务填表

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

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 14.04.1 LTS 64 位) 系统,因此我的文章都是基于该操作系统和体系结构的。不同的 C

3、PU 支持不同的指令集,我使用的是 Intel Core i7 870 处理器,所有代码都在这上面运行。另外我将用 nasm 汇编,你可以用下面命令来安装:   sudo apt-get install nasm   I它的版本应该是 2.0.0 或者更高了。我是用的是 2013年12月29日编译的 NASM version 2.10.09 版本。最后一部分,你需要一款写汇编代码的文本编辑器,我使用配有 nasm-mode.el 的 Emacs 编辑器。当然这不是强制性的,你可以选择任何你喜欢的文本编辑器。如果你像我一样使用的是 Emacs,你可以下载 nasm-mode.el,将你的 E

4、macs 配置成这样:   (load "~/.emacs.d/lisp/nasm.el")   (require 'nasm-mode)   (add-to-list 'auto-mode-alist '(".(asm|s)$" . nasm-mode))   这就是目前我们需要准备的所有东西,其它工作在接下来的文章中会提到。   x64 语法   这里我就不全面介绍汇编的语法了,我们仅提一下这篇文章中用到的语法。通常 NASM 程序会被划分为不同的段(section),这篇文章中我们会涉及到两个段:   数据段(data section)   代码段(text sectio

5、n)   数据段用来定义常量(constant),常量是在运行时不会改变的数据。你可以定义数字或其他常量等等,声明一个数据段的语法如下:   section .data   代码段是存放代码(code)的,该段必须以 global_start 开始,告诉内核这里是程序开始执行的地方。   section .text   global _start   _start:   注释是以 ; 开始。每个 NASM 代码行包含下面四个字段的组合:   [label:] instruction [operands] [; comment]   中括号括起来的字段表示是可选的。基本 NAS

6、M 指令由两部分组成,第一部分是需要执行指令的名字,第二部分是该指令的操作数。例如:   MOV COUNT, 48 ;将数值 48 存放到 COUNT 变量中   Hello world   让我们用 NASM 汇编来写第一个程序吧,当然是传统的打印 “Hello world” 的程序。这是代码:   section .data   msg db "hello, world!"   section .text   global _start   _start:   mov rax, 1   mov rdi, 1   mov rsi, msg   mov rdx, 13

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

8、 中央处理单元(CPU)是计算机中的硬件,它读取计算机程序中的指令,完成系统中基本的算术、逻辑、输入/输出操作。   好了,CPU 完成一些操作,例如算术操作等,但是它从哪获得操作的数据呢?第一个答案是内存。然而从内存中读取和存入数据的速度远远低于处理器的速度,它涉及到复杂的通过控制总线来发送数据请求的过程。因此,CPU 有其内部的存储位置,称为寄存器(register)。   x64_registers   那么我们写 mov rax, 1,意思是将 1 放到 rax 寄存器中。现在我们知道什么是 rax、rdi、rbx 等等了吧,但是还需要知道什么时候使用 rax,什么时候使用 rs

9、i 等等。   rax —— 临时寄存器,当我们调用系统调用时,rax 保存系统调用号   rdx —— 用来向函数传递第三个参数   rdi —— 用来向函数传递第一个参数   rsi —— 用来向函数传递第二个参数的指针   换句话说,我们就是调用了 sys_write 系统调用,该函数原型是:   ssize_t sys_write(unsigned int fd, const char *buf, size_t count)   它有三个参数:   fd —— 文件描述符,0、1、2 分别代表标准输入、标准输出和标准错误   buf —— 字符数组的指针,用来保存从

10、fd 指向的文件中获取的内容   count —— 表示要从文件中读入到字符数组的字节数   我们知道 sys_write 系统调用带有三个参数,它在系统调用表中有一个系统调用号。我们再看看程序的实现,将 1 放到 rax 寄存器中,它意思是我们使用 sys_write 系统调用;下一行将 1 存到 rdi 寄存器,它是 sys_write 的第一个参数,1 代表标准输出;然后我们将 msg 的指针存到 rsi 寄存器中,这是 sys_write 的第二个参数 buf;接着我们传递 sys_write 最后一个参数(字符串的长度)到 rdx 寄存器中。现在,我们有了 sys_write 的

11、所有参数,就可以在 11 行使用 syscall 来调用它了。好了,我们打印出 “Hello world” 字符串,现在需要从程序中正确退出。我们传递 60 到 rax 寄存器,60 是 exit 的系统调用号;以及将 0 传递给 rdi 寄存器,这是错误码,0 表示我们的程序正确地退出。这就是 “Hello world” 的所有分析,相当简单吧:)现在我们编译程序,假设我们的程序放在 hello.asm 文件中,那么我们需要运行下面的命令来执行:   nasm -f elf64 -o hello.o hello.asm   ld -o hello hello.o   编译链接完成之后,我们得到可执行文件 hello,可以使用 ./hello 来运行,可以在终端看到输出 “Hello world”。   总结   本文用一个简单不能再简单的程序开始第一部分,接下来我们会看到一些算术运算。如果你有任何问题或者建议可以给我评论。   更多信息请查看IT技术专栏   

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服