程序的机器级表示——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,一经查实,立即删除!

相关文章

VBA 拆分Excel中的各sheet为文件

一. 方式1 xlOpenXMLWorkbook&#xff1a;.xlsx格式的文件xlWorkbookDefault&#xff1a;当前Excel的格式(当前Excel是什么格式&#xff0c;被拆分出的sheet页所生成的文件就是什么格式)"\"&#xff1a;可以使用Application.PathSeparator代替 Sub 拆分工作表() 初…

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

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

多态的原理

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

leetcode40-Combination Sum II

题目 给定一个候选人编号的集合 candidates 和一个目标数 target &#xff0c;找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用 一次 。 注意&#xff1a;解集不能包含重复的组合。 示例 1: 输入: candidates [10,1,2,7,…

大模型日报2024-05-04

大模型日报 2024-05-04 大模型资讯 谷歌发布全新语言模型 GPT-Next 摘要: 谷歌推出了其新一代语言模型 GPT-Next&#xff0c;该模型在多个自然语言处理任务上取得了显著的进步。 百度推出大型语言模型 Baidu LM 2.0 摘要: 百度发布了升级版的大型语言模型 Baidu LM 2.0&#xf…

使用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 支持哪些日志框架&#…

数据结构习题--Fizz Buzz

数据结构习题–Fizz Buzz 给你一个整数 n &#xff0c;找出从 1 到 n 各个整数的 Fizz Buzz 表示&#xff0c;并用字符串数组 answer&#xff08;下标从 1 开始&#xff09;返回结果&#xff0c;其中&#xff1a; answer[i] “FizzBuzz” 如果 i 同时是 3 和 5 的倍数。 ans…

【Java 算法实现】合并两个有序数组(逆向双指针)

【Java 算法实现】合并两个有序数组 题目描述 给定两个按非递减顺序排列的整数数组 nums1 和 nums2&#xff0c;以及两个整数 m 和 n&#xff0c;分别表示 nums1 和 nums2 中的元素数目。 你需要将 nums2 合并到 nums1 中&#xff0c;使合并后的数组同样保持非递减顺序排列。…

应用分层和企业规范

目录 一、应用分层 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…

你不知道的TCP协议:四次握手!

你不知道的TCP协议&#xff1a;四次握手&#xff01; 前言&#xff1a;我们都知道建立一个tcp连接需要进行三次握手&#xff0c;甚至被问到为什么不是四次握手、两次握手 本文将要介绍tcp协议中的四次握手 正文&#xff1a; 当一个客户端向服务端发起tcp连接请求时&#xf…

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

【信息系统项目管理师知识点速记】成本管理:制定预算

11.5 制定预算 目的: 制定预算的目的是建立一个经批准的成本基准,汇总项目的所有活动或工作包的成本估算,以便监督和控制项目的绩效。 输入: 项目管理计划: 成本管理计划: 描述如何将项目成本纳入项目预算中。资源管理计划: 提供资源费率、差旅成本估算等信息。范围基…

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…