C/C++程序员一定要知道的一些X86汇编语句

目录

1. 寄存器 

通用寄存器:

栈寄存器:

指令指针寄存器:

2. 汇编指令

mov:

add、sub:

lea:

jmp:

call、ret:

3. 总结


我们在学习C语言和C++的期间,有很多时候需要反汇编看语句所对应的汇编是什么样的,这篇文章我就带大家来看一些最常见的一些X86汇编语句,我们就使用 Intel语法。AT&T语法与Intel语法很相似。

在最开始提一下:

Intel 和 AT&T 就明显的有一点是:

        Intel语法 操作数 前面是 目的地,后面是源,AT&T 与之相反。 

文中 [] 方括号内存放的都是 地址 。

1. 寄存器 

为什么要在这里先说寄存器呢,因为有80%汇编语句是围绕着 内存 和 寄存器来操作执行的~,所以在这里我们就来简单说一些比较重要寄存器。

通用寄存器:

eax ecx edx ebx

首先说这个几个寄存器的使用顺序就是上面说的,a、c、d、b

这几个寄存器,通常就是用来存储一些CPU计算时候的临时变量,比如说某个表达式计算出的结果等等。

有一个注意点:通常来说函数在返回一个值的时候都是借助 eax 寄存器

栈寄存器:

esp ebp

以上两个寄存器是记录当前的函数栈帧内存上的地址范围,所以我们可以将他理解成两个指针

esp指针(寄存器)指向栈顶,ebp指针(寄存器)指向栈底。

我们在调用函数的时候,这两个指针就要改变。

指令指针寄存器:

eip

eip寄存器是用来记录CPU当前执行的命令在内存中的地址,简单说就说 eip中存储的是当前执行的语句的位置

每次执行完语句,eip寄存器会自动 ++ 到下一条命名的地址上。因为他存储的是地址,所以我们也可以将他理解成一个指针。

在我们调用函数的时候,eip寄存器就会指向被调函数的最开始位置。

2. 汇编指令

这一部分,我们通过一些简单的汇编指令来聊~

mov:
mov eax, 0

上面的语句的意思是:将 0 移动到(赋值给) eax 寄存器 

mov eax, ecx

上面的语句的意思是:将 ecx寄存器 的值移动到(赋值给) eax寄存器

mov eax, dword ptr[a]

上面的语句的意思是:将 a变量所对应的内存空间的值 移动到(赋值给) eax寄存器,这里的 "dword ptr []" 我们就不展开说了,大家可以理解成 访问 a变量 所对应的内存空间。

这个地方 a 其实是一个地址, "dword ptr []" 是那这个地址去解引用,以后再细说吧~~


add、sub:

不多说,顾名思义:加 和 减,举个例子直接过:

add eax, 10    # eax += 10sub ecx, 20    # ecx -= 20

lea:

全称:Load Effective Address

作用是:取地址,我们也直接来看例子,一看就懂

int a = 10;
# mov eax, 0Ah
// 这里的 0Ah 是 10 的 十六进制表示形式
# mov dword ptr[a], eaxint *p = &a;
# lea eax, [a]
# mov dword ptr [p], eax 

jmp:

全称: jump 跳转指令

jmp 是一个无条件跳转指令,会直接跳转到 操作数 所对应的地址(或者标签)上

在此基础上有一些分支,如 je 相等情况下跳转、jle 相等情况下跳转 ...  有很多,常常用在 if ... else ... 这类分支结构中,这里我们就不细说了。

稍微提一下:如何知道 jle 或者 je 这种指令是否跳转呢,有一个 efl 寄存器(eflag),其中记录了一些执行之后的标志,CPU看这个就知道跳不跳了,这里不细说了。


call、ret:

call 是用来调用函数,有跳转的功能,通常和 ret 配合使用,也有跳转的功能。

call、ret 的使用方法和 jmp 相似,在后面 跟上 要跳转到的地址就可以了。

call 在跳转之前会在函数栈帧中压入未来要返回的地址,ret 在跳转回来之后会将 call 压入的值给函数栈帧中弹出(逻辑上,实际上是直接让 esp + 4)


3. 总结

这篇文章,讲到了一些常见得到 汇编指令的用法和一些简单原理,总体来说不难,意在帮助大家能看懂一些反汇编的指令,更深入的了解C/C++的底层,大家只用常调试,多看,这些自然就懂啦~~

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

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

相关文章

北邮21硕后端知识网络

blog 整理北邮21渣硕Java后端开发知识网络,阅读笔记以及技术博客,持续更新!欢迎Star! GitHub: https://github.com/WeiXiao-Hyy/blog Java 基础篇 一文带你搞懂final关键字 Java并发编程 fucking-java-concurrency解读你真…

webrtc客户端测试和arm平台测试(待补充)

一、关于API的使用研究 二、遇到的一些问题 1、snd_write Broken pipe 写音频数据到缓存不及时导致,codec没有数据可以播放。 alsa总结 WebRTC源码研究(1)WebRTC架构 WebRTC 中的基本音频处理操作

“深入探讨Java中的对象拷贝:浅拷贝与深拷贝的差异与应用“

前言:在Java编程中,深拷贝(Deep Copy)与浅拷贝(Shallow Copy)是两个非常重要的概念。它们涉及到对象在内存中的复制方式,对于理解对象的引用、内存管理以及数据安全都至关重要。 ✨✨✨这里是秋…

多粒度特征融合(细粒度图像分类)

多粒度特征融合(细粒度图像分类) 摘要Abstract1. 多粒度特征融合1.1 文献摘要1.2 研究背景1.3 创新点1.4 模型方法1.4.1 Swin-Transformer1.4.2 多粒度特征融合模块1.4.3 自注意力1.4.4 通道注意力1.4.5 图卷积网络1.4.6 基于Vision-Transformer的两阶段…

04-4.1.1 串的定义和基本操作

👋 Hi, I’m Beast Cheng👀 I’m interested in photography, hiking, landscape…🌱 I’m currently learning python, javascript, kotlin…📫 How to reach me --> 458290771qq.com 喜欢《数据结构》部分笔记的小伙伴可以订…

Rust 实战丨SSE(Server-Sent Events)

📌 SSE(Server-Sent Events)是一种允许服务器向客户端浏览器推送信息的技术。它是 HTML5 的一部分,专门用于建立一个单向的从服务器到客户端的通信连接。SSE的使用场景非常广泛,包括实时消息推送、实时通知更新等。 S…

编程参考 - 使用静态连接库和动态链接库的区别

静态库链接和动态库链接是在程序中包含外部库的两种方法。这两种方法各有利弊。下面是静态库链接和动态库链接的详细比较: 静态库链接 静态链接包括在编译时将所有必要的库代码直接包含到可执行文件中。 优点: 可移植性: 可执行文件是自包…

数据结构笔记 3 串 数组 广义表

以下了解即可,暂时没发现有什么考点 参考: 【数据结构】——多维数组和广义表_数据结构loc-CSDN博客 相对应的题目: 他这个数组不是从0开始的,是从1开始的,所以为了配合公式要减1 下面这道题又不一样,它是…

【python深度学习】——torch.einsum|torch.bmm

【python深度学习】——torch.einsum|torch.bmm 1. 基本用法与示例2. torch.bmm 1. 基本用法与示例 基本用法: torch.einsum(equation, *operands)equation: 一个字符串,定义了张量操作的模式。 使用逗号来分隔输入张量的索引,然后是一个箭头&#xff…

linux中dd命令以及如何测试读写速度

dd命令详解 dd命令是一个在Unix和类Unix系统中非常常用的命令行工具,它主要用于复制文件和转换文件数据。下面我会详细介绍一些dd命令的常见用法和功能: 基本语法 dd命令的基本语法如下: bash Copy Code dd [option]...主要选项和参数 if…

Data Mining2 复习笔记6 - Optimization Hyperparameter Tuning

6. Optimization & Hyperparameter Tuning Why Hyperparameter Tuning? Many learning algorithms for classification, regression, … Many of those have hyperparameters: k and distance function for k nearest neighbors, splitting and pruning options in decis…

力扣1712.将数组分成三个子数组的方案数

力扣1712.将数组分成三个子数组的方案数 确定左边界的值 然后二分求右边界的范围 右边界处的前缀和满足 2*s[i] < s[r] < (s[n] s[i]) / 2 int s[100010];const int N 1e97;class Solution {public:int waysToSplit(vector<int>& nums) {int n nums.siz…

Mac清洁神器CleanMyMac2024一键轻松解决电脑垃圾问题

【CleanMyMac】苹果mac电脑垃圾清理软件 大家好&#xff01;今天我要给大家种草一个超级好用的苹果mac电脑垃圾清理软件&#xff0c;那就是 CleanMyMac。相信很多人都遇到过电脑运行速度变慢、存储空间不足的问题&#xff0c;而这款软件就是解决这些问题的救星&#xff01;让我…

2024眼睛健康展|江苏省护眼产品与眼部保健展会|眼科医疗展

呵护眼睛、守护光明&#xff0c;2024全国眼睛健康产业博览会暨眼科医学大会10月11日在南京启幕&#xff1b; 办展&#xff1a;随着时代的进步、社会的发展&#xff0c;特别是电子产品的深度普及&#xff1b;近些年&#xff0c;人们的用眼时间越来越久&#xff0c;由此产生高发…

一个python 程序执行顺序

1. Python程序执行顺序 在Python中&#xff0c;程序的执行顺序通常遵循几个基本原则&#xff1a; &#xff08;1&#xff09;从上到下&#xff1a;Python代码通常从上到下顺序执行。 &#xff08;2&#xff09;代码块&#xff1a;由缩进&#xff08;如空格或制表符&#xff…

20240605解决飞凌的OK3588-C的核心板刷机原厂buildroot不能连接ADB的问题

20240605解决飞凌的OK3588-C的核心板刷机原厂buildroot不能连接ADB的问题 2024/6/5 13:53 rootrootrootroot-ThinkBook-16-G5-IRH:~/repo_RK3588_Buildroot20240508$ ./build.sh --help rootrootrootroot-ThinkBook-16-G5-IRH:~/repo_RK3588_Buildroot20240508$ ./build.sh lun…

基于I2C协议的OLED显示(利用U82G库)

目录 一、I2C协议的基本原理和时序协议I2C通信协议的原理I2C时序基本单元I2C时序 二、建立工程RCC配置TIM1配置时钟树配置工程配置 三、U8g2移植精简u8g2_d_setup.c精简u8g2_d_memory.c编写移植函数stm32_u8g2.hstm32_u8g2.c 四、实验1.U82G的demo例程2.显示网名昵称中文取模步…

L48---1637. 两点之间不包含任何点的最宽垂直区域(排序)---Java版

1.题目描述 2.思路 &#xff08;1&#xff09;返回两点之间内部不包含任何点的 最宽垂直区域 的宽度。 我的理解是相邻两个点&#xff0c;按照等差数列那样&#xff0c;后一个数减去相邻的前一个数&#xff0c;才能保证两数之间不含其他数字。 &#xff08;2&#xff09;所以&…

c++|unordered系列关联式容器(unordered_set、unordered_map介绍使用+哈希结构)

目录 一、unordered_set的介绍与使用 1.1unordered_set介绍 1.2unordered_set使用 2.2.1构造 2.2.2容量 2.2.3修改 二、unordered_map的介绍与使用 2.1unordered_map介绍 2.2unordered_map使用 2.2.1构造 2.2.2容量 2.2.3修改 三、底层结构(哈希) 3.1哈希概念 3.2哈…

【回调函数】

1.回调函数是什么&#xff1f; 回调函数就是⼀个通过函数指针调用的函数。 如果你把函数的指针&#xff08;地址&#xff09;作为参数传递给另⼀个函数&#xff0c;当这个指针被用来调用其所指向的函数 时&#xff0c;被调用的函数就是回调函数。回调函数不是由该函数的实现方…