C++利用汇编挖掘编程语言的本质..

news2024/11/15 23:57:02

1.谬论

很多非一手的资料特别是中文资料其实并不可靠 因为很多作者都是直接通过转载他人的作品 也不管他人作品真与假 而且有一部分的作品中的言论和官方描述相去甚远 有的则是翻译的过程中出现了问题
比如sizeof很多人认为是一个函数 其实他并不是一个函数 而是一个运算符 是一个一元运算符

而且就算官方也有出错的时候 这就要求我们具有辨别的能力了

2.建议

首选官方资料(手册、官网……)
英文资料 > 中文资料
具备验证知识点正确性的能力(有关编程语言知识点的正确性 掌握汇编语言是最靠谱的检验手段)

3.汇编的好处

1.可以检验知识点的正确性
2.可以进行破解
3.可以制作外挂

4.代码本质挖掘

1.sizeof本质

sizeof本质上不是一个函数 而是一个运算符
在汇编语言中 函数利用了call完成调用操作 而在sizeof的底层汇编中 压根没有call的影子 说明根本就不是所谓的函数
在这里插入图片描述
从另外一个方面也可以看出sizeof不是一个函数
在这里插入图片描述
我们可以看到直接打印sizeof(char)的结果和打印sizeof(char)的底层汇编所执行的操作是一模一样的 说明编译器在编译阶段是直接可以识别出sizeof()的结果并且替换成相应的结果(因此sizeof也被称为编译时特性) 既然如此 更能说明sizeof不是一个函数

2.a++和++a的区别

3.if-else和switch的效率比较

4.程序的内存布局

5.多态的实现原理

5.程序的本质

程序是以机器码(或称作CPU指令 即由0和1组成的)的形式储存在硬盘中的(在储存之前 是由编译器将其编译成机器码的) 当运行软件的时候 程序会被装载到内存之中 然后CPU会根据机器码的要求调用计算机的其他设备完成相关的需求(CPU只能识别机器码)
CPU由寄存器、运算器、控制器组成 其中寄存器也有和内存一样的储存功能 那么CPU在访问寄存器方面肯定是比内存要来的快的 原因在于寄存器更加接近CPU

6.寄存器和内存

通常情况下 CPU会先将内存中的数据储存到寄存器中 然后在对寄存器中的数据进行访问或者运算
在这里插入图片描述
我的要求是对红色内存中的数据进行加一操作
其中 首先会将红色内存中的数据储存到eax寄存器中 即mov eax, 红色内存空间
接着让EAX的数据和1相加 即add eax, 1
最后会将结果储存到蓝色的内存空间中 即mov 蓝色内存空间, eax

从反汇编的角度也可以说明验证我的说法
在这里插入图片描述

7.编程语言的发展

机器语言(由0和1组成) -> 汇编语言(用符号替代了0和1 可读性更强了) -> 高级语言(c/c++/java…… 接近人类自然语言 更具有可读性)
对于同一个操作 将寄存器ebx的内容传入到eax中(以下代码是伪代码)
机器语言:010100000001111011010
汇编语言:mov eax, ebx
高级语言:eax = ebx;

很多语言都有高级语言编译成汇编语言、汇编语言编译成机器语言最终运行到计算机上的过程
其中汇编语言和机器语言是可以相互转换的 也就是说汇编可以编译成机器语言 机器语言也可以反编译成汇编语言 所以汇编语言和机器语言是一一对应的 每一条汇编语言都有与之对应的机器语言
然而高级语言虽然可以通过编译得到汇编/机器 但是汇编/机器几乎不能够反编译成高级语言
在这里插入图片描述
在这里插入图片描述
对比两张图片可以看到两个不同的高级语言底层的汇编/机器是一模一样的 更能说明汇编/机器几乎不能够还原成高级语言(因为一旦还原的话 会产生歧义)

不同的CPU架构(x86和arm)的机器指令是不一样的(CPU架构不一样 CPU就不一样 那么所处理的机器指令也就不一样)

8.一些编程语言的本质

1.编译型语言(不依赖虚拟机)

诸如C/C++/OC/Swift 轻易反汇编
在这里插入图片描述

2.脚本语言

诸如Python/PHP/JS 由脚本引擎(比如浏览器等)解析
在这里插入图片描述

3.编译型语言(依赖虚拟机)

Java/Ruby 由JVM进行字节码的装载
在这里插入图片描述

9.visual studio中的反汇编

在这里插入图片描述
从上图可见 反汇编中的每一行大致都是由三部分组成 第一部分是内存中用于标识机器码的位置的地址值 第二部分则是这段代码的机器码 第三部分则是这段代码的汇编代码
在这里插入图片描述

而且高级语言中的一行代码不一定对应着汇编/机器码中的一行 可能是多行

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

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

相关文章

【Godot4自学手册】第十八节主人公的血量显示

今天,我主要学习主人公的血量显示,在屏幕的左上角,会显示主人公的头像,后面会显示血量进度条,当主人公受到伤害时,血量会实时变动,显示绿色血条减少,后是红色血量逐渐减少到正确位置…

进阶了解C++(4)——多态

在上篇文章中,简单的介绍了多态中的概念以及其相关原理。本文将针对多态中其他的概念进一步进行介绍,并且更加深入的介绍关于多态的相关原理。 目录 1. 抽象类: 2. 再谈虚表: 3. 多继承中的虚函数表: 1. 抽象类&am…

(每日持续更新)jdk api之PipedInputStream基础、应用、实战

博主18年的互联网软件开发经验,从一名程序员小白逐步成为了一名架构师,我想通过平台将经验分享给大家,因此博主每天会在各个大牛网站点赞量超高的博客等寻找该技术栈的资料结合自己的经验,晚上进行用心精简、整理、总结、定稿&…

Web APIs知识点讲解(阶段二)

DOM-事件基础 一.事件 1.事件 目标:能够给 DOM元素添加事件监听 事件:事件是在编程时系统内发生的动作或者发生的事情,比如用户在网页上单击一个按钮 事件监听:就是让程序检测是否有事件产生,一旦有事件触发,就立即调用一个函…

【BBuf的CUDA笔记】十四,OpenAI Triton入门笔记三 FusedAttention

0x0. 前言 继续Triton的学习,这次来到 https://triton-lang.org/main/getting-started/tutorials/06-fused-attention.html 教程。也就是如何使用Triton来实现FlashAttention V2。对于FlashAttention和FlashAttention V2网上已经有非常多的介绍了,大家如…

华为配置WLAN高密业务示例

配置WLAN高密业务示例 组网图形 图1 配置高密WLAN环境网络部署组网图 业务需求组网需求数据规划配置思路配置注意事项操作步骤配置文件 业务需求 体育场由于需要接入用户数量很大,AP间部署距离较小,因此AP间的干扰较大,可能导致用户上网网…

ShardingJdbc实战-ShardingJdbc配置及读写分离

文章目录 一、项目搭建二、测试结果1.访问http://localhost:8085/user/save2.访问http://localhost:8085/user/listuser 一、项目搭建 新建一个Spring Boot工程 引入依赖-sharding、ssm、数据库驱动 <properties><java.version>1.8</java.version><shardi…

linux系统Jenkins工具的node节点配置

Jenkins工具添加节点 node 节点的作用node节点配置 node 节点的作用 分布式构建&#xff1a;通过添加多个节点&#xff0c;可以在多台计算机上并行执行构建任务&#xff0c;从而加快构建速度和提高效率。节点可以是物理计算机、虚拟机、云实例或容器等。扩展计算能力&#xff…

仓储自动化新解:托盘四向穿梭车驶入智能工厂 智能仓储与产线紧密结合

目前&#xff0c;由于对仓库存储量的要求越来越高&#xff0c;拣选、输送以及出入库频率等要求也越来越高&#xff0c;对此&#xff0c;在物流仓储领域&#xff0c;自动化与智能化控制技术得以快速发展&#xff0c;货架穿梭车在自动库领域的应用越来越广泛。现阶段&#xff0c;…

皇冠测评:网络电视盒子哪个品牌好?电视盒子排行榜

欢迎各位来到我们的测评频道&#xff0c;本期我们要分享的产品是电视盒子&#xff0c;因很多网友留言不知道网络电视盒子哪个品牌好&#xff0c;我们通过为期一个月的测评后整理了电视盒子排行榜&#xff0c;想买电视盒子的可以看看下面这五款产品&#xff0c;它们各方面表现非…

MySQL安装部署-NDB版

NDB&#xff08;Network Database&#xff09;是网络数据库&#xff0c;其架构是由MySQL Server集群以及NDB存储引擎集群组成&#xff0c;是存算分离架构&#xff0c;MySQL Server主要是负责计算、NDB存储引擎主要负责数据存储&#xff0c;其特点是支持高可用、支持无单点故障、…

SOCKS55代理与Http代理有何区别?如何选择?

在使用IPFoxy全球代理时&#xff0c;选择 SOCKS55代理还是HTTP代理&#xff1f;IPFoxy代理可以SOCKS55、Http协议自主切换&#xff0c;但要怎么选择&#xff1f;为解决这个问题&#xff0c;得充分了解两种代理的工作原理和配置情况。 在这篇文章中&#xff0c;我们会简要介绍 …

输入一个字符串,将其中的数字字符移动到非数字字符之后

输入一个字符串&#xff0c;将其中的数字字符移动到非数字字符之后&#xff0c;并保持数字字符贺非数字字符输入时的顺序。 代码&#xff1a; #include <cstdio> #include <queue> using namespace std; int main() {char str[200];fgets(str, 200, stdin);//读入…

10分钟SkyWalking与SpringBoot融合并整合到Linux中

1.依赖配置 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.2.0.RELEASE</version></dependency><dependency><groupId>org.springframe…

经销商文件分发 怎样兼顾安全和效率?

经销商文件分发是指将文件、资料、产品信息等从制造商或经销商传递给经销商的过程。这一过程对于确保经销商能够获取最新的产品信息、销售策略、市场活动资料等至关重要。 想要管理众多经销商合作伙伴之间的文件传输并提高效率&#xff0c;可以采取以下措施&#xff1a; 1、建…

2024 2.24~3.1 周报

目录 一、本周计划 二、DD-Net整体介绍 三、DDNet的体系结构 四、损失函数 五、课程学习 六、实验环境 A. SEG盐数据集 B. OpenFWI数据集 C. 训练和前沿设置&#xff08;未完&#xff09; 七、结论 八、跑代码——对比试验结果&#xff08;CBAM&#xff09; 1. In…

Redis 之五:Redis 的主从复制

概念 主从复制&#xff0c;是指将一台 Redis 服务器的数据&#xff0c;复制到其他的Redis服务器。前者称为主节点(master)&#xff0c;后者称为从节点(slave)&#xff1b;数据的复制是单向的&#xff0c;只能由主节点到从节点。 默认情况下&#xff0c;每台Redis服务器都是主节…

Spark Shuffle Tracking 原理分析

Shuffle Tracking Shuffle Tracking 是 Spark 在没有 ESS(External Shuffle Service)情况&#xff0c;并且开启 Dynamic Allocation 的重要功能。如在 K8S 上运行 spark 没有 ESS。本文档所有的前提都是基于以上条件的。 如果开启了 ESS&#xff0c;那么 Executor 计算完后&a…

C#用户界面,UI设置密码隐藏显示

两种方法&#xff0c;第一种&#xff0c;在文本框属性设置UseSystemPasswordChar为True。 这里默认是以黑点隐藏显示。 第二种&#xff0c;在文本框属性设置隐藏显示的符号&#xff0c;这里设置为星号*。

探索Android多屏互动技术:构建无缝交互体验

探索Android多屏互动技术&#xff1a;构建无缝交互体验 1. 简介 在当前移动设备和智能家居应用中&#xff0c;多屏互动技术已经成为一个备受关注的话题。随着移动设备&#xff08;如智能手机、平板电脑&#xff09;和智能家居设备的普及&#xff0c;用户对于多屏协同工作、娱…