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

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.mzph.cn/news/713078.shtml

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

相关文章

【FAQ】HarmonyOS SDK 闭源开放能力 —Push Kit

1.问题描述 升级到4.0.0.59版本后,通过pushService.getToken获取华为的token时报如下错误:Illegal application identity. 解决方案 Mate 40 Pro (NOH) 从 4.0升级到4.1版本后,会出现UDID变化,影响历史的调试签名使用&#xff…

档案数字化验收流程

档案数字化验收流程通常包括以下步骤: 1. 确定验收标准:制定档案数字化验收标准,明确要求检查的内容、质量要求、验收标准等。 2. 准备验收环境:为档案数字化验收准备合适的环境,包括验收场所、设备、人员等。 3. 准备…

vscode 引入外部依赖包

背景 我要在vscode中写一些antlr代码生成的cpp代码,但是在引入头文件#include "antlr4-runtime.h"的时候,出现报错,显示没有这个头文件,显然这是我们没有导入相关的包,因此我首先尝试了将antlr4的依赖源码在…

Semantic human matting

1.introduction 数据集包括,时尚模特数据集,超过18.8w张模特图,从中选出35311张图片,DIM数据集,仅包含人类的图像,202个前景图像,背景来自coco数据集和互联网,背景图不含人类&#x…

python 基础知识点(蓝桥杯python科目个人复习计划56)

今日复习内容:做题 例题1:最小的或运算 问题描述:给定整数a,b,求最小的整数x,满足a|x b|x,其中|表示或运算。 输入格式: 第一行包括两个正整数a,b; 输出格式&#…

小乌龟操作Git

1、选择小乌龟作为git客户端 最近使用idea来操作git的时候频频出现问题,要么是提交代码的时候少了某些文件,导致克隆下来无法运行,要么是提交速度太慢。 反正是在idea中操作git体验非常不好,所以决定来换一种方式来操作git。从网…

蓝桥杯算法题汇总

一.线性表:链式 例题:旋转链表 二.栈: 例题:行星碰撞问题 三.队列 三.数组和矩阵 例题:

FPGA-VGA成像原理与时序

什么是VGA: VGA, Video Graphics Array。即视频图形阵列,具有分辨率高、显示速率快、颜色丰富等优点。VGA接口不但是CRT显示设备的标准接口,同样也是LCD液晶显示设备的标准接口,具有广泛的应用范围。在FGPA中,常广泛用于图像处理等领域。 VGA 显示器成像原理 在 VGA 标准刚兴…

C语言 vs Rust应该学习哪个?

C语言 vs Rust应该学习哪个? 在开始前我有一些资料,是我根据网友给的问题精心整理了一份「C语言的资料从专业入门到高级教程」, 点个关注在评论区回复“888”之后私信回复“888”,全部无偿共享给大家!!&am…

bun 文件类型

Typescript Bun 原生支持开箱即用的 TypeScript。所有文件在执行之前都由 Bun 的快速本机转译器即时转译。与其他构建工具类似,Bun 不执行类型检查;它只是从文件中删除类型注释。 bun index.js bun index.jsx bun index.ts bun index.tsxBun 运行时行为的某些方面…

linux系统如何安装nginx

首先下载nginx安装包 wget -c http://nginx.org/download/nginx-1.23.1.tar.gz然后解压安装包 tar -zxvf nginx-1.23.1.tar.gz如果服务器没有wget,可以安装一下,有的话可以跳过 yum install -y wget 然后安装相关依赖 yum install -y gcc-c zlib zl…

最新企微hook开源版

免费的企微框架 支持文本消息,图片消息,视频消息,文件消息。 其他可自行下载测试。 有兴趣可以进群交流。720192224 。群内不定期开源气味hook源码 BOOL WxWorkSendData(string data) { WX_GETOBJDATA obj { 0 }; //参数结构…

MATLAB练习题:排队论问题的模拟

​讲解视频:可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。​ MATLAB教程新手入门篇(数学建模清风主讲,适合零基础同学观看)_哔哩哔哩_bilibili 下面我们来看一道排队论的题目。假设某银行工作时间内只有一个…

Kubernetes/k8s的核心概念

一、什么是 Kubernetes Kubernetes,从官方网站上可以看到,它是一个工业级的容器编排平台。Kubernetes 这个单词是希腊语,它的中文翻译是“舵手”或者“飞行员”。在一些常见的资料中也会看到“ks”这个词,也就是“k8s”&#xff…

如何解决代理ip服务器连接问题

在当今的数字化时代,互联网连接已成为生活和工作中不可或缺的一部分。然而,在尝试访问互联网资源时,用户有时会遇到“代理服务器可能有问题,或地址不正确(你尚未连接)”的错误提示。这种情况通常表明计算机的网络设置存在问题&…

自然语言处理之语言模型(LM):用c++通过自然语言处理技术分析语音信号音高

要通过自然语言处理技术分析语音信号音高,我们可以采用以下步骤: 首先,我们需要获取语音信号的原始音频数据。可以使用C中的音频处理库(例如PortAudio或ALSA)来捕获音频输入并将其转换为数字音频数据。 接下来&#x…

python统计分析——广义线性模型的评估

参考资料:用python动手学统计学 残差是表现数据与模型不契合的程度的重要指标。 1、导入库 # 导入库 # 用于数值计算的库 import numpy as np import pandas as pd import scipy as sp from scipy import stats # 导入绘图的库 import matplotlib.pyplot as plt i…

mybatis中if的test如何判断双等号(==)

我们在写mybatis.xml时往往会写!&#xff0c;如&#xff1a; <if test"validType ! null and validType ! "> </if>当时如何判断等于某一个值呢&#xff0c;如下将test的双引号改为单引号&#xff0c;值用双引号&#xff1a; <if testvalidType &q…

面经 | Java创建线程的三种方式

利用JUC包创建线程的三种方式&#xff1a; 通过继承Thread类创建线程类实现Runnable接口创建线程类通过Callable和Future接口创建线程 继承Thread类创建线程 class Thread1 extends Thread {Overridepublic void run() {System.out.println("启动线程1");} }实现R…

第七篇:微信小程序的跳转页面

前提&#xff1a;建议还没学HTML、CSS、JavaScript、JSON、vue、Ajax的兄弟姐妹们&#xff0c;先去把这些基础补好过一遍&#xff0c;不然不好理解微信小程序 前面这一篇已经讲过一次<navigator>跳转页面的用法了&#xff0c;今天详细讲解一下 回顾&#xff1a; 小程序…