![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
汇编
文章平均质量分 86
是星星鸭
希望对你有所帮助。
展开
-
C++对象拷贝
首先看下面这张图:假设我们现在有一个对象数组,里边有三个对象,O1、O2和O3;但是随着业务逻辑的提升,这三个对象已经无法满足我们的使用了;那么我们肯定要再添加几个对象进去,但是我们又不想重新创建O1、O2、O3;那么怎么办呢?首先在C语言中,我们肯定是用一些拷贝函数之类的,通过赋值拷贝将一个对象的内容拷贝给另一个对象进行使用;这个过程就叫对象拷贝;当然C++中也有类似拷贝对象内容的方式,并且C++的编译器支持我们用更简单的方式进行内存复制,接下来就让我们看看C++中如何实现对象拷贝;原创 2022-11-18 22:13:14 · 2735 阅读 · 0 评论 -
【C++】运算符重载
谁说++就一定要加了?谁说++就一定要加1?这也就是为什么计算机中1+1不一定等于2,因为这个操作符是别人自己按照他的思维来重载的,我们当然也可以按照自己的思维来写,++我们写个减1,但是没必要,一般情况下我们还是遵守计算机的算法来写,不要乱写,没什么好处;原创 2022-11-15 18:42:42 · 1459 阅读 · 0 评论 -
【汇编 C++】多态底层---虚表、__vfptr指针
我们可以确认了,如果类中具有virtual修饰的虚函数,无论有多少个虚函数,类的对象在底层中只有一个虚表,因为我们传入的是虚表的首地址,只占用四个字节,并且这个虚表首地址是类对象的第一个成员!原创 2022-11-14 21:46:34 · 860 阅读 · 0 评论 -
C++多态_virtual
多态按字面的意思就是多种形态。当类之间存在层次结构,并且类之间是通过继承关联时,就会用到多态。C++ 多态意味着调用成员函数时,会根据调用函数的对象的类型来执行不同的函数。我们知道,面向对象编程思想就是为了节省代码的重复编写,那么我会围绕节省代码编写的例子去讲多态,可能例子会有些莫名其妙,但是知道这个道理就行了。class Person{ // 基类Person:成员有a、bpublic:int a;int b;}void print() // 基类添加一个打印成员的函数,会继承到派生类。原创 2022-11-11 21:58:46 · 1171 阅读 · 0 评论 -
32位汇编ebp、ebp-4、ebp+4、ebp+8等含义
ebp-4: 从ebp-4开始到函数提升堆栈后的栈顶之间被称为缓冲区(一般缓冲区栈顶是:函数调用时提升堆栈后esp的值),我们常说的局部变量都是定义在这里,所以大致可以理解为函数中。我们知道,当调用了一个函数后,底层汇编大多数会使用ebp寻址的方式去查找参数,关于ebp与esp寻址可以看我这篇文章《ebp寻址》。的含义,先总结这么多,因为长时间不使用汇编可能会忘了这些东西,忘了的话翻到这篇文章看看就行了。ebp+4:存放call指令调用函数时压入堆栈的。ebp+C: 存放函数传参的第二个参数地址。原创 2022-11-07 21:27:31 · 4385 阅读 · 0 评论 -
C++继承时常见问题
目录前言子类默认调用父类无参构造 观点一 观点二子类调用父类有参构造子类与父类的构造顺序总结结语 关于C++继承的基础,请看:《C++继承浅谈》或自行百度 如果父类不写构造函数,那么子类构造对象的时候不传参/传参调用的都是子类自己的无参/有参构造。 验证代码如下: 运行查看结果: 断点、编译、调试、ALT+8转到反汇编: F10步过,不会进入函数内部,F11跟进这两个函数的内部:原创 2022-10-18 11:50:13 · 762 阅读 · 0 评论 -
【汇编 C++】C++引用详解、引用与指针的区别
引用是C++的一种新类型,引用变量是一个别名,也就是说,它是某个已存在变量的另一个名字。一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量。那么怎么证明ref是a的别名呢?我们知道,别名和本体指的是同一个东西,所以操作ref应该就是操作a,如下:运行,如果ref和a的值一直都是一样的,就代表ref是a的别名,和a是同一个东西如下:观点证明成功!先来对比基础变量的定义对比,引用和指针的区别。原创 2022-10-16 01:51:59 · 1533 阅读 · 0 评论 -
【汇编 C++】在堆中创建对象
栈区也就是之前汇编调用函数时提升堆栈的'堆栈',只有在函数调用时才会有堆栈,函数调用结束后该堆栈虽然在,但已经被使用并且不属于这个函数。所以说栈(堆栈)中的数据只有函数调用时存在,函数调用完成后将不存在。原创 2022-10-11 01:10:38 · 2299 阅读 · 0 评论 -
【汇编 C++】C++继承浅谈
继承就是数据的复制struct Master // 父类(基类){int a;int b;};struct Slave:Master // 子类(派生类){int c;int d;};int main(){// 此处下断点查看x的大小(子类的大小)return 0;原创 2022-10-10 20:47:33 · 507 阅读 · 0 评论 -
【汇编 C++】类的构造与析构
本文章将会可能会涉及到汇编的知识,不过没有关系,我会讲的尽量通俗易懂;另外本篇文章开始前,建议了解下什么是函数重载,这个概念很简单的--有相同的函数名,但参数列表不相同的函数,就是函数重载;和类具有相同名称,并且没有返回值类型的函数,就是类的构造函数{Test() // 和类具有相同的名、并且没有返回值{}};}类的构造函数名前加上'~'这个符号,就是类的析构函数{Test(){printf("你调用了一次类的构造函数\n");}原创 2022-10-09 21:32:52 · 1658 阅读 · 0 评论 -
【汇编 C++】C++this指针、this指针长什么样?
this指针是“C++封装后的结构体或类中成员函数”的一个默认参数,用于存放当前结构体变量(类的对象)的首地址,它是一个隐藏的参数。概念听起来很模糊,不急,代码测试之后就能明白。{int a;int b;int c;};// 结构体的外部定义函数{}int main(){// 此处下断点,观察反汇编return 0;}我们先把函数定义在结构体的外部,现在的结构体就是个简单的结构体,没有进行封装,函数也是个简单的函数,没有this指针。原创 2022-10-08 16:39:28 · 792 阅读 · 0 评论 -
【汇编 C】从汇编分析为什么传递结构体指针比传递结构体变量高效
本文章使用的工具是vs2010,本篇文章主要讲解结构体指针作为参数传递与结构体变量作为参数传递的对比,不谈值传递与址传递的概念。 先声明下观点:当有少量结构体成员时,传递结构体指针和结构体变量的差距不大;当有大量结构体成员时,随着成员越来越多,传递指针的效率也越来越高,与传递变量的差距也越来越大。原创 2022-10-08 00:08:33 · 854 阅读 · 0 评论 -
【汇编 C】C语言常用的三种函数调用约定:__cdecl、__stdcall、__fastcall
本篇文章使用的工具是vs2010,内容可能涉及到汇编的知识,建议有一些汇编基础的再来看,不过没有汇编基础也没有关系,了解一下这三种调用约定即可。如果有听不懂的地方可以私信我,有错误的地方望指出。原创 2022-10-06 01:19:46 · 2017 阅读 · 0 评论 -
【汇编 C】循环语句goto、while、dowhile、for
在不少实际问题中有许多具有规律性的重复操作,因此在程序中就需要重复执行某些语句。一组被重复执行的语句称之为循环体,能否继续重复,决定循环的终止条件。循环结构是在一定条件下反复执行某段程序的流程结构,被反复执行的程序被称为循环体。循环语句是由循环体及循环的终止条件两部分组成的。例子:(这里就拿汇编举例吧)首先401210位置的jmp会跳到401230的位置,然后将1,2,3,4分别放到对应的寄存器中之后再一次使用jmp跳到401210的位置。原创 2022-09-28 00:13:38 · 3226 阅读 · 2 评论 -
【汇编 C】switch为什么高效率?分支语句if else与switch
本文章使用到的工具是vs2010,建议使用VC++6,操作都一样。什么是分支语句?分支语句即进行一个选择,如果出现情况A则进行相应的操作;如果出现情况B则进行相应的操作,等等。if else分支语句我们也知道if是如果的意思,那么可以根据意思理解,比如:if(love == true) // 如果love是真不是假printf("这是真爱。\n");// 那么就输出这是真爱。原创 2022-09-24 17:10:03 · 1520 阅读 · 0 评论 -
【汇编 C】i++和++i底层刨析
不过++ii输出的是+1之后的变量,而ii++输出的则是+1之前备份的临时变量。代码的逻辑很简单,简单到没有逻辑。都是先+1,然后再输出。原创 2022-09-21 22:57:02 · 900 阅读 · 0 评论 -
【汇编 C】函数嵌套底层原理堆栈图、为什么局部变量一定要赋初始值
对于堆栈图不够了解的话,可以先观看这篇文章《函数调用底层堆栈图》。此外,对于编译器最好使用VC++6。因为我当前使用的是win11操作系统,所以只能使用vs2010进行讲解。对于vs2010和VC++6对于局部变量在内存中的处理是不一样的,本篇文章以VC++6为标准。原创 2022-09-21 01:35:28 · 836 阅读 · 0 评论 -
【汇编 C】变量与参数的内存布局、函数的返回值以及浅谈黑客基础攻击方式
首先看本篇文章,最好了解一下程程序运行的堆栈图是什么样的?怎么去画?我的这篇文章有讲过《堆栈图》。变量就是用来存放值的一块内存,变量名就是存放数据地址的别名,这句话是一定要记住的,我们接下来讲的东西会涉及到这一点。变量分为全局变量和局部变量。通过上面的代码,我们大致可以把堆栈图进行划分一下了,如下:由堆栈图可知:ebp中存放原来ebp的值ebp+4存放的是返回地址ebp+8开始往下存放的是参数,有几个参数就占几个格子ebp-4往上蓝色的区域就是缓冲区,也就是局部变量存放的地址。原创 2022-09-17 17:43:50 · 1373 阅读 · 0 评论 -
【汇编 C】全局变量、局部变量、修改数值外挂的原理
外挂中提到的所谓基址,其实就是全局变量,变量是什么?变量就是一块地址的别名。全局变量全局可见,从被定义往下所有的地方都可以对它进行操作,局部变量只能在定义它的函数内使用,其他地方不可见。原创 2022-09-13 00:17:15 · 2250 阅读 · 0 评论 -
【汇编 C】函数调用的底层原理解析堆栈图
通过上面的逐步观察,我们可以发现,调用函数无非就是call指令进入函数,然后提升堆栈,创建缓冲区,之后将需要用到的寄存器拷贝一份,然后运算,完成后将寄存器的值还原,平衡堆栈。就是这些步骤完成了一个函数的调用。原创 2022-09-12 13:34:39 · 1256 阅读 · 0 评论 -
【汇编】32位汇编常用的指令
这是因为这时候我们的EFL标志寄存器中的DF位是0,如果改成1,那么操作完esi和edi之后,esi和edi中的值就会减,这里就不测试了,知道有这么回事就行。JMP指令就是用来修改EIP的值的,我们知道寄存器EIP中存放着下一次将会执行指令的地址,所以我们可以通过JMP指令修改程序下一次执行的内容。原创 2022-09-09 15:05:37 · 4817 阅读 · 0 评论 -
【汇编 C】vs2010如何调出反汇编窗口、最简单的C程序以及__ASM关键字
简单来说,编译器就是将“一种语言(通常为高级语言)”翻译为“另一种语言(通常为低级 语言 )”的程序。在这里我是用vs2010写C语言,所以编译器就是帮我将C语言转换成汇编。原创 2022-09-08 21:59:27 · 2108 阅读 · 0 评论 -
【汇编】esp寻址与ebp寻址
esp寻址的优缺点: 优点:便捷 缺点:当遇到复杂的、函数中对堆栈有操作的,esp寻址就会变得有些困难。 例如: 我们之前的测试两数相加,都是把参数从堆栈中取出,放在寄存器里,但实际开发中,寄存器里的值一般情况下都是有用的,说到底就是我们不能直接取出寄存器里的值,我们需要将值备份一份,然后再寻址,使用完成之后再将原来的值取出,如下:原创 2022-09-08 17:49:16 · 1769 阅读 · 2 评论 -
【汇编】堆栈平衡、外平栈与内平栈
如果要返父程序,则当我们在堆栈中进行堆栈操作的时候,一定要保证在RET这条指令之前,ESP指向的是我们压入堆栈中的地址。也就是说我们的call指令调用函数之后,他的下一个地址会push到堆栈中,我们在函数中无论怎么操作堆栈,ret返回前堆栈必须指向的是call指令压入的地址。(这里我们假设函数参数不会操作堆栈,只是函数内容操作堆栈) 如果通过堆栈传递参数,那么函数执行完毕之后,要平衡参数导致的堆栈变化。原创 2022-09-07 21:50:11 · 3038 阅读 · 1 评论 -
【汇编】堆栈传参
前言:当我们函数传递的参数有十多个的时候,比如某十个数相加的结果,这个时候我们的通用寄存器已经不够用了,所以我们只能采用堆栈传参的方式来传递参数。原创 2022-09-07 13:52:03 · 1209 阅读 · 0 评论 -
【汇编】汇编中的函数
在汇编中,函数就是一系列指令的合集,为了完成某个会重复使用的特定功能。下面这四行指令就算是一个函数了:该函数的功能就是往寄存器里赋值。原创 2022-09-06 23:25:35 · 2600 阅读 · 0 评论 -
【汇编】反调试之Fake F8
功能键F7和F8在DTDEBUG工具中,都是用来执行指令的,那他们有什么区别呢?下面将为大家讲解在调试阶段F7和F8的区别,以及如何做到简单的反调试。原创 2022-09-04 17:05:47 · 620 阅读 · 1 评论 -
【汇编】32位操作系统进程为什么最大可以占用4G内存?
首先我们要知道这里提到的4G内存指的是虚拟的,并不是内存条或硬盘这种内存,它仅仅只是一个概念。原创 2022-09-01 22:23:01 · 1499 阅读 · 1 评论 -
【汇编】CPU的大小端存储模式
本文章是基于汇编来介绍cpu的大小端存储模式,使用到的软件是DTDEBUG,网上很多地方都有资源,所以就不介绍了,下面以32位汇编来介绍什么是cpu的大小端模式。原创 2022-08-31 17:05:34 · 854 阅读 · 0 评论