程序的机器级表示——Intel x86 汇编讲解

往期地址:

  • 操作系统系列一 —— 操作系统概述
  • 操作系统系列二 —— 进程
  • 操作系统系列三 —— 编译与链接关系
  • 操作系统系列四 —— 栈与函数调用关系
  • 操作系统系列五 —— 目标文件详解
  • 操作系统系列六 —— 详细解释【静态链接】
  • 操作系统系列七 —— 装载
  • 操作系统系列八 ——动态链接
  • 操作系统系列九 ——系统调用和API
  • 从编译角度看c和c++混合编译
  • stripped文件描述以及gdb反汇编工具使用
  • 操作系统的信号量操作以及实战中的踩坑分析

本期主题:
程序的汇编指令讲解


目录

  • 1. x86-64的历史由来
  • 2. x86-64的寄存器信息
  • 3. 操作数指示符
    • 1. 寻址方式
    • 2. 数据传输指令
      • example 实例
    • 3. 压入和弹出栈数据


1. x86-64的历史由来

  1. Intel处理器系列俗称x86系列,刚开始是单芯片,16位微处理器,后面随着集成电路技术不断提高,现在都是64位的处理器,称为x86-64;
  2. 由于是从16位体系结构扩展成32位的,Intel用术语 字(words) 来表示16位数据类型,因此,32位被称为双字(double words),64位称为 四字(quad words)

下图是C语言类型在 x86-64位中的大小

C语言类型Intel数据类型汇编代码后缀大小(字节)
char字节b1
shortw2
int双字l4
long四字q8
char*四字q8
float单精度s4
double双精度l8

大多数gcc生成的汇编代码都有一个字符的后缀,表明操作数的大小。例如数据传输指令mov有四种变种:

  1. movb(传送字节)
  2. movw(传输字)
  3. movl(传输双字)
  4. movq(传输四字)

2. x86-64的寄存器信息

x86-64的机器代码和C语言代码相差非常大,C语言程序员比较关注的如下:

  • 程序计数器(通常也被称为"PC",在x86-64中用%rip来表示),表示将要执行的下一条指令在内存中的地址;
  • 通用目的寄存器,一个x86-64的中央处理器包含一组16个存储64位值的通用目的寄存器;
  • 栈指针寄存器,%rsp用来指明运行时栈的结束位置;
  • 帧指针寄存器,%rbp所直接指向的数据是调用该函数之前的rbp值,即可以认为是被调用函数的返回值

寄存器如下图:
在这里插入图片描述

3. 操作数指示符

大多数指令有一个或多个操作数(operand),指示出执行一个操作中要使用的源数据值,放置位置以及目的位置。

1. 寻址方式

根据操作数的可能性,将寻址方式分为三种类型:

  1. 立即数,用来表示常数值,例如 $1234,就是代表常数1234;
  2. 寄存器,表示某个寄存器的内容,我们用符号 r a r_a ra 来表示任意寄存器,用符号 R[ r a r_a ra] 来表示它的值;
  3. 内存引用,根据计算出来的地址访问某个内存位置;

寻址模式综合一下:
在这里插入图片描述

2. 数据传输指令

将数据从一个位置复制到另一个位置的指令。
MOV 指令的简单形式如下,代表着将数据从 S移动到D这个位置:

MOV S,D 

MOV指令由四条指令组成:movb、movw、movl、movq,对应着我们前面说的汇编指令后缀名的差异,其实主要差别在于操作数的大小不同

MOV操作指令有几个特点:

  1. 源操作数指定的是一个数据,这个数据可以是 立即数,也可以存储在寄存器或者内存中;
  2. 目的操作数指定的是一个位置,要么是寄存器或者是一个地址;
  3. mov指令不能两个操作数都指向内存地址,如果想要实现将一个值从一个内存地址复制到另一个内存地址,需要使用两条指令——第一条指令将源值加载到寄存器中,第二条指令将寄存器值写入目的位置;

举例看下面的命令,实际上的意思就是将 0x4050这个数据,放在eax寄存器中

movl $0x4050, %eax

example 实例

看一个指针的具体例子
源码:

long exchange(long *xp, long y)
{long x = *xp;*xp = y;return x;
}

对应的反汇编代码,使用 objdump -d xxx 来进行反汇编:
在这里插入图片描述
对汇编代码进行解释:

// 前面讲过了,%rdi存的是第一个参数,%rsi 存的是第二个参数
// 在例子中具体具体就是  %rdi存的是xp这个指针,%rsi存的是y
// (%rdi),取出xp指针的值,即*xp
mov (%rdi),%rax , 把*xp赋值给返回值x
mov %rsi,(%rdi) , 把y赋值给*xp

从上面的汇编代码中可以看出两点:

  1. C语言的指针其实就是地址。间接引用指针其实就是将该指针放在一个寄存器中,然后在内存引用中使用这个寄存器。
  2. 像x这样的局部变量通常保存在寄存器中,而不是内存中。由于访问寄存器比访问内存要快得多。

3. 压入和弹出栈数据

栈是一种数据结构,可以添加或者删除值,遵循后进先出的原则。通过push把数据压入栈中,通过pop操作删除数据。
栈向下增长,栈顶元素的地址是所有栈中元素地址最低的。%rsp保存着栈顶元素的地址。

指令效果描述
pushq SR[%rsp] <- R[%rsp] - 8;
M[R[%rsp]] <- S
将四字压入栈
1. 先是取出%rsp寄存器的值,并减8,再给回%rsp寄存器;
2. 将S的值给到新的%rsp寄存器的值所指向的内容中
popq DD <- M[R[%rsp]] ;
R[%rsp] <- R[%rsp] + 8
将四字弹出栈
1. 先是取出%rsp寄存器的值,给到8;
2. 将%rsp寄存器+8

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/6477.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于肤色模型的人脸识别FPGA实现,包含tb测试文件和MATLAB辅助验证

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 matlab2022a的测试结果如下&#xff1a; vivado2019.2的仿真结果如下&#xff1a; 将数据导入到matlab中&#xff0c; 系统的RTL结构图如下图所示…

多态的原理

前言:以下的内容均是在VS2019的环境中&#xff0c;32位平台下的 目录 1.多态的实现条件 虚函数重写的两个例外 一个题加深理解 总结 重载 重写 重定义区别 2.多态的实现原理 单继承 多继承 动态多态和静态多态 多态的好问题 1.多态的实现条件 虚函数&#xff1a;被…

使用Ruoyi的定时任务组件结合XxlCrawler进行数据增量同步实战-以中国地震台网为例

目录 前言 一、数据增量更新机制 1、全量更新机制 2、增量更新机制 二、功能时序图设计 1、原始请求分析 2、业务时序图 三、后台定时任务的设计与实现 四、Ruoyi自动任务配置 1、Ruoyi自动任务配置 2、任务调度 总结 前言 在之前的相关文章中&#xff0c;发表文章列…

2024年 Java 面试八股文——SpringBoot篇

目录 1. 什么是 Spring Boot&#xff1f; 2. 为什么要用SpringBoot 3. SpringBoot与SpringCloud 区别 4. Spring Boot 有哪些优点&#xff1f; 5. Spring Boot 的核心注解是哪个&#xff1f;它主要由哪几个注解组成的&#xff1f; 6. Spring Boot 支持哪些日志框架&#…

应用分层和企业规范

目录 一、应用分层 1、介绍 &#xff08;1&#xff09;为什么需要应用分层&#xff1f; &#xff08;2&#xff09;如何分层&#xff1f;&#xff08;三层架构&#xff09; MVC 和 三层架构的区别和联系 高内聚&#xff1a; 低耦合&#xff1a; 2、代码重构 controlle…

2024网络安全面试问题宝典(4万字)

2024网络安全厂商面试问题宝典(4万字) 目录 评分标准网络基础问题 TCP建立连接要进行3次握手&#xff08;syn-syn&#xff0c;ack-ack&#xff09;&#xff0c;而断开连接要进行4次&#xff08;fin-ack-fin-ack&#xff09;TCP&#xff0c;UDP区别&#xff1a;安全常用的协议…

Cloudera最新认证体系-2024Hadoop认证

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

K8S哲学 - 资源调度 HPA (horizontal pod autoScaler-sync-period)

kubectl exec&#xff1a; kubectl exec -it pod-name -c container-name -- /bin/sh kubectl run 通过一个 deployment来 演示 apiVersion: apps/v1 kind: Deployment metadata:name: deploylabels: app: deploy spec: replicas: 1selector: matchLabels:app: deploy-podt…

Universal Thresholdizer:将多种密码学原语门限化

参考文献&#xff1a; [LS90] Lapidot D, Shamir A. Publicly verifiable non-interactive zero-knowledge proofs[C]//Advances in Cryptology-CRYPTO’90: Proceedings 10. Springer Berlin Heidelberg, 1991: 353-365.[Shoup00] Shoup V. Practical threshold signatures[C…

YUM源仓库部署

一、YUM仓库服务 1、概述 2、准备安装源 软件仓库的提供方式 YUM软件仓库类型 仓库类型安装路径本地源baseurlfile://…ftp源baseurlftp://…在线源baseurlhttp://… baseurlhttps://… RPM软件包的来源 CentOS发布的RPM包集合第三方组织发布的RPM包集合用户自定义的RPM包…

mac nvm install node<version> error 404

mac m2芯片遇到的问题&#xff0c;估计m系列的应该也有这个问题&#xff0c;在这里记录一下 解决方案&#xff1a; ## 需要先处理一下兼容就OK了arch -x86_64 zsh nvm install returns curl: (22) The requested URL returned error: 404 Issue #2667 nvm-sh/nvm GitHub

ue引擎游戏开发笔记(29)——实现第三人称角色随手柄力度进行移动

1.需求分析 角色可以随手柄力量大小进行走路和跑步&#xff0c;不动时保持角色停顿。 2.操作实现 1.思路&#xff1a;通过动画蓝图和动画混合实现角色移动和输入的联系。 2.建立动画蓝图和混合空间&#xff1a; 3.在混合空间中对角色移动进行编辑&#xff1a; 4.在蓝图中设定变…

Nginx(搭建高可用集群)

文章目录 1.基本介绍1.在微服务架构中的位置2.配置前提3.主从模式架构图 2.启动主Nginx和两个Tomcat1.启动linux的tomcat2.启动win的tomcat3.启动主Nginx&#xff0c;进入安装目录 ./sbin/nginx -c nginx.conf4.windows访问 http://look.sunxiansheng.cn:7777/search/cal.jsp 3…

python邮件发送

第一种方式 一&#xff1a;发送的邮件要设置授权码&#xff0c;通过邮箱邮箱授权码去验证&#xff0c;让邮件服务器帮我们去转发邮件到要接收的邮件&#xff0c;代码中的授权码&#xff0c;是需要登录126邮箱&#xff08;我这里是以126邮件发送的&#xff0c;具体的以自己为准…

Mybatis入门2

本文章是下面文章的扩充 Mybatis入门-CSDN博客文章浏览阅读432次&#xff0c;点赞6次&#xff0c;收藏10次。Mapper接口创建在java代码块中//dao层/*** 功能&#xff1a;查询所有用户数据* return*/https://blog.csdn.net/luosuss/article/details/138420052 映射配置文件 i…

【Python可视化】pyecharts

Echarts 是一个由百度开源的数据可视化&#xff0c;凭借着良好的交互性&#xff0c;精巧的图表设计&#xff0c;得到了众多开发者的认可。而 Python 是一门富有表达力的语言&#xff0c;很适合用于数据处理。当数据分析遇上数据可视化时&#xff0c;pyecharts 诞生了。 需要安…

使用PyTorch从头实现Transformer

前言 本文使用Pytorch从头实现Transformer&#xff0c;原论文Attention is all you need paper&#xff0c;最佳解读博客&#xff0c;学习视频GitHub项目地址Some-Paper-CN。本项目是译者在学习长时间序列预测、CV、NLP和机器学习过程中精读的一些论文&#xff0c;并对其进行了…

node.js中path模块-路径处理,语法讲解

node中的path 模块是node.js的基础语法&#xff0c;实际开发中&#xff0c;我们通过使用 path 模块来得到绝对路径&#xff0c;避免因为相对路径带来的找不到资源的问题。 具体来说&#xff1a;Node.js 执行 JS 代码时&#xff0c;代码中的路径都是以终端所在文件夹出发查找相…

基于Springboot的滑雪场管理系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的滑雪场管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&a…

搜好货API接口:快速获取商品列表的利器

搜好货商品列表API接口允许开发者根据关键字搜索并获取相关的商品列表数据。接口支持多种参数配置&#xff0c;可以根据需求灵活调整搜索条件和结果返回格式。 点击获取key和secret API接口请求说明 请求地址&#xff1a;https://api.souhaohuo.com/goods/search请求方法&…