程序的机器级表示——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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

java下乡扶贫志愿者招募管理系统springboot-vue

计算机技术在现代管理中的应用&#xff0c;使计算机成为人们应用现代技术的重要工具。能够有效的解决获取信息便捷化、全面化的问题&#xff0c;提高效率。 技术栈 前端&#xff1a;vue.jsElementUI 开发工具&#xff1a;IDEA 或者eclipse都支持 编程语言: java 框架&#xff1…

c++ 红黑树学习及简单实现

1. 了解红黑树 1.1. 概念 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个节点增加一个存储位表示节点的颜色&#xff0c;可以是红色&#xff0c;或是黑色&#xff0c;通过对任何一条从根到叶子的路径上各个节点的着色方式进行限制&#xff0c;红黑树确保没有一条路…

Dockerfile镜像实例

目录 一、构建SSH镜像 1. 建立工作目录 2. 生成镜像 3. 启动容器并修改root密码 二、systemctl镜像 1. 建立工作目录 2. 生成镜像 3. 运行镜像容器 ​编辑 4. 测试容器systemct 三、Nginx镜像 1. 建立工作目录 2. 编写Dockerfile脚本 3. 编写run.sh启动脚本 4. …

IDEA启动Tomcat启动失败:jar包未部署【部署jar包】

IDEA启动Tomcat报错java.lang.ClassNotFoundException:org.springframework.web.context.ContextLoaderListener&#xff1a;jar包未部署【部署jar包】 学习java&#xff0c;开始跟着教程的步伐学习maven下载jar包&#xff0c;tomcat启动项目&#xff0c;发现项目未启动成功也…

虾皮(Shopee)商品详情API接口:轻松获取商品深度信息

API接口概述 虾皮的商品详情API接口是专为商家和开发者提供的服务接口&#xff0c;通过该接口&#xff0c;您可以快速、准确地获取指定商品的详细信息。这些信息包括但不限于商品标题、价格、库存、描述、图片、规格参数等&#xff0c;为您的商品展示、比价、推荐等场景提供有…

C++设计模式-结构型设计模式

写少量的代码来应对未来需求的变化。 单例模式 定义 保证一个类仅有一个实例&#xff0c;并提供一个该实例的全局访问点。——《设计模式》GoF 解决问题 稳定点&#xff1a; 类只有一个实例&#xff0c;提供全局的访问点&#xff08;抽象&#xff09; 变化点&#xff1a…

SpringCloud微服务:Eureka 和 Nacos 注册中心

共同点 都支持服务注册和服务拉取都支持服务提供者心跳方式做健康检测 不同点 Nacos 支持服务端主动检测提供者状态&#xff1a;临时实例采用心跳模式&#xff0c;非临时&#xff08;永久&#xff09;实例采用主动检测模式Nacos 临时实例心跳不正常会被剔除&#xff0c;非临时实…

【uniapp】H5+、APP模拟浏览器环境内部打开网页

前言 今天将智能体嵌入到我的项目中&#xff0c;当作app应用时&#xff0c;发现我使用的webview组件&#xff0c;无论H5怎么登录都是未登录&#xff0c;而APP却可以&#xff0c;于是进行了测试&#xff0c;发现以下几种情况&#xff1a; 方法<a>标签webviewAPP✅✅网页…

YOLOv5改进之bifpn

目录 一、原理 二、代码 三、在YOLOv5中的应用 一、原理 论文链接:

课题学习(二十三)---三轴MEMS加速度计芯片ADXL372

声明&#xff1a;本人水平有限&#xff0c;博客可能存在部分错误的地方&#xff0c;请广大读者谅解并向本人反馈错误。 一、基础配置 测量范围-200g-200g&#xff0c;分辨率为12位&#xff0c; V s 、 V D D I / O V_s、V_{DDI/O} Vs​、VDDI/O​范围为1.6V-3.5V 1.1 引脚配…

【银角大王——Django课程——用户表的基本操作2】

用户表的基本操作2 编辑用户按钮删除按钮入职日期——不显示时分&#xff0c;只显示年月日——使用DataField函数不使用DateTimeField修改models记得重新执行命令&#xff0c;更新数据库结构修改前修改后 编辑用户按钮 点击编辑&#xff0c;跳转到编辑页面&#xff08;将编辑的…

CrossOver支持的软件多吗 CrossOver支持软件列表 crossover兼容性查询

如果你是一个喜欢在Mac上工作的用户&#xff0c;但又不想放弃一些Windows上的优秀软件&#xff0c;那么可以考虑使用一些兼容工具来运行Windows程序。其中&#xff0c;CrossOver就是一款功能强大且受欢迎的兼容工具。那么&#xff0c;CrossOver到底能支持哪些Windows软件呢&…

JVM笔记2--垃圾收集算法

1、如何确认哪些对象“已死” 在上一篇文章中介绍到Java内存运行时的各个区域。其中程序计数器、虚拟机栈、本地方法栈3个区域随着线程而生&#xff0c;随线程而灭&#xff0c;栈中的栈帧随着方法的进入和退出而有条不紊的执行着入栈和出栈操作。每个栈帧中分配多少内存基本上…

VMvare如何更改虚拟机内共享文件夹的挂载点

更改虚拟机内共享文件夹的路径 进入目录 /etc/init.d ,并找到vmware-tools文件 里面有配置项 vmhgfs_mnt"/mnt/hgfs" 将引号内的内容更改为你需要挂载的路径,重启即可 注意挂载的路径不能是 “/”&#xff0c;必须根目录下的某个文件夹&#xff0c;或者其子文件夹 …

定时器编程前配置和控制LED隔一秒亮灭

1.配置定时器 0 工作模式16位计时 2.给初值&#xff0c;定一个10ms出来 3.开始计时

环形链表的判断方法与原理证明

&#xff08;题目来源&#xff1a;力扣&#xff09; 一.判读一个链表是否是环形链表 题目&#xff1a; 解答&#xff1a; 方法&#xff1a;快慢指针法 内容&#xff1a;分别定义快慢指针&#xff08;fast和slow&#xff09;&#xff0c;快指针一次走两步&#xff0c;慢指…

物体检测:如何检测小物体?

原文地址&#xff1a;https://medium.com/voxel51/how-to-detect-small-objects-cfa569b4d5bd 2024 年 4 月 22 日 物体检测是计算机视觉的基本任务之一。在高层次上&#xff0c;它涉及预测图像中物体的位置和类别。最先进的&#xff08;SOTA&#xff09;深度学习模型&#x…

3031087 -“无数据”:物料不显示在 MRP 应用中

症状 使用其中一个 MRP 应用&#xff08;监控物料覆盖范围、管理物料覆盖范围、监控外部需求等&#xff09;时无法找到物料。 用户在搜索过滤器时会收到错误消息“无数据”。 “本 KBA 中的图像/数据来自 SAP 内部系统、示例数据或演示系统。任何与真实数据相似的都是完全巧…

Apache反代理Tomcat项目,分离应用服务器和WEB服务器

项目的原理是使用单独的机器做应用服务器&#xff0c;再用单独的机器做WEB服务器&#xff0c;从网络需要访问我们的应用的话&#xff0c;就会先经过我们的WEB服务器&#xff0c;再到达应用程序&#xff0c;这样子的好处是我们可以保护应用程序的机器位置&#xff0c;同时还可以…

R语言中,查看经安装的包,查看已经加载的包,查看特定包是否已经安装,安装包,更新包,卸载包

创建于&#xff1a;2024.5.4 R语言中&#xff0c;查看经安装的包&#xff0c;查看已经加载的包&#xff0c;查看特定包是否已经安装&#xff0c;安装包&#xff0c;更新包&#xff0c;卸载包 文章目录 1. 查看经安装的包2. 查看已经加载的包3. 查看特定包是否已经安装4. 安装包…