C++反编译-类与结构体分析二

类作为参数传递

main函数;17 :    {0x401373    lea    0x4(%esp),%ecx0x401377    and    $0xfffffff0,%esp0x40137a    pushl  -0x4(%ecx)0x40137d    push   %ebp0x40137e    mov    %esp,%ebp0x401380    push   %ecx0x401381    sub    $0x24,%esp0x401384    call   0x4270d0 <__main>;18 :        A a(3, 4);0x401389    lea    -0x10(%ebp),%eax0x40138c    movl   $0x4,0x4(%esp)0x401394    movl   $0x3,(%esp)0x40139b    mov    %eax,%ecx0x40139d    call   0x4385c0 <A::A(int, int)>0x4013a2    sub    $0x8,%esp;19 :        printAll(a);0x4013a5    mov    -0x10(%ebp),%eax //此处赋值后eax = 30x4013a8    mov    -0xc(%ebp),%edx //此处赋值后edx = 40x4013ab    mov    %eax,(%esp) 0x4013ae    mov    %edx,0x4(%esp)0x4013b2    call   0x401350 <printAll(A)>;20 :        return 0;0x4013b7    mov    $0x0,%eax;21 :    }0x4013bc    mov    -0x4(%ebp),%ecx0x4013bf    leave0x4013c0    lea    -0x4(%ecx),%esp0x4013c3    ret
类>构造函数
;7  :        A(int a, int b) {
0x4385c0    push   %ebp
0x4385c1    mov    %esp,%ebp
0x4385c3    sub    $0x4,%esp
0x4385c6    mov    %ecx,-0x4(%ebp)
;8  :            this->a = a;
0x4385c9    mov    -0x4(%ebp),%eax
0x4385cc    mov    0x8(%ebp),%edx
0x4385cf    mov    %edx,(%eax)
;9  :            this->b = b;
0x4385d1    mov    -0x4(%ebp),%eax
0x4385d4    mov    0xc(%ebp),%edx
0x4385d7    mov    %edx,0x4(%eax)
;10 :        }
0x4385da    nop
0x4385db    leave
0x4385dc    ret    $0x8
带对象参的方法printAll
;13 :    void printAll(A a) {
0x401350    push   %ebp
0x401351    mov    %esp,%ebp
0x401353    sub    $0x18,%esp
;14 :        printf("%d,%d\n", a.a, a.b);
0x401356    mov    0xc(%ebp),%edx //此处赋值后edx = 4
0x401359    mov    0x8(%ebp),%eax //此处赋值后eax = 3
0x40135c    mov    %edx,0x8(%esp)
0x401360    mov    %eax,0x4(%esp)
0x401364    movl   $0x4b9025,(%esp)
0x40136b    call   0x4b5850 <printf(char const*, ...)>
;15 :    }
0x401370    nop
0x401371    leave
0x401372    ret

原文地址:https://www.cnblogs.com/reverse201/p/10325339.html

时间: 2024-10-16 01:03:00

C++反编译-类与结构体分析二的相关文章

C++反编译-类与结构体分析

类>构造函数 ;5 : A(int a, int b, int c) { 0x438638 push %ebp 0x438639 mov %esp,%ebp 0x43863b sub $0x4,%esp 0x43863e mov %ecx,-0x4(%ebp) ;6 : this->a = a; 0x438641 mov -0x4(%ebp),%eax 0x438644 mov 0x8(%ebp),%edx //等价于取a的值 0x438647 mov %edx,(%eax) //等价于把a赋

C++反编译-类与结构体分析三

main函数 ;15 : { 0x40137a push %ebp 0x40137b mov %esp,%ebp 0x40137d and $0xfffffff0,%esp 0x401380 sub $0x60,%esp 0x401383 call 0x427130 <__main> ;16 : A a; ;17 : a.a = 1; 0x401388 movl $0x1,0x38(%esp) ;18 : a.b = 2; 0x401390 movl $0x2,0x3c(%esp) ;19 :

[转]站在OC的基础上快速理解Swift的类与结构体

(阅读此文章前,您已经有一定的Object-C语法基础了!) 2014年,Apple推出了Swift,最近开始应用到实际的项目中. 首先我发现在编写Swift代码的时候,经常会遇到Xcode不能提示,卡顿,直接闪退等问题,尤其是在Swift和OC混编时.(不知道其他开发者是否也有这样的经历,但是我相信这样的问题,很快会得到解决) 然后感觉Swift并不像网上很多朋友说的那样简单.有很多细节问题是值得注意的,甚至有很多思路是颠覆了传统的开发语言的!又有很多特性是结合了其他编程语言的优点! Swif

在OC的基础上快速理解Swift的类与结构体

Swift中,类和结构体都是对数据和方法进行封装的常用做法!首先我们来看看他们的共同之处: 都可以有属性和方法: 都有构造器: 都支持附属脚本: 都支持扩展: 都支持协议. 然后我们来看看他们的不同之处: 类有继承: 结构体有一个自动生成的逐一初始化构造器: 在做赋值操作时,结构体总是被拷贝(Array有特殊处理): 结构体可以声明静态的属性和方法: 从设计模式的角度来分析,类的设计更侧重于对功能的封装,而结构体的设计更侧重于对数据的封装.(汽车与书架来区分类与结构体) 一.构造过程 1. 默认

Swift学习】Swift编程之旅---类和结构体(十三)

与其他编程语言所不同的是,Swift 并不要求你为自定义类和结构去创建独立的接口和实现文件.你所要做的是在一个单一文件中定义一个类或者结构体,系统将会自动生成面向其它代码的外部接口. 注意:通常一个类的实例被称为对象.然而在Swift 中,类和结构体的关系要比在其他语言中更加的密切,本章中所讨论的大部分功能都可以用在类和结构体上.因此,我们会主要使用实例而不是对象. 比较类和结构体 类和结构体都具有以下特性: 定义用于存储值的属性 定义提供特定能力或功能的方法 定义提供使用下标语法访问值的下标

OC类中一些细节问题(对象类存储、类中结构体的用法)

一:OC中得方法名 注意:方法名冒号和后面的and方法名冒号  都是方法名 一:对象的存储细节 类加载到代码区(包括类中得属性和方法).对象动态加载到堆内存中.指向对象的指针存放在栈区. 三:定义类常见的错误 定义类的时候,常见的错误 1)类的定义不能嵌套 2)不要漏写 @end 3) 不要忘记写实现类(如果忘记写了,编译不会报错,运行时候才报错) 4)定义成员变量的大括号经常漏写 5) 如果不写@interface 只有 @implementation 这可以,但是会报警告,建议不要这么写 6

C#中的类,结构体课堂笔记

C#中的类 C#是一门面向对象的语言,类是C#中一种复杂的数据类型. c#中定义一个类的基本格式: class 类名 { //类成员定义 } 默认情况下,如果class之前没有显示指定访问修饰符,则类的访问修饰符为internal,表示仅在当前项目内可以访问. 除了internal,C#中的修饰符还有private, protected, public, abstract, sealed等修饰符,以及这几个修饰符的组合. 修饰符 访问权限 无或者internal 只能在同一程序集访问类 publ

Swift 的类、结构体、枚举等的构造过程Initialization(上)

构造过程是为了使用某个类.结构体或枚举类型的实例而进行的准备过程.这个过程包含了为实例中的每个属性设置初始值和为其执行必要的准备和初始化任务. 构造过程是通过定义构造器(Initializers)来实现的,这些构造器可以看做是用来创建特定类型实例的特殊方法.与 Objective-C 中的构造器不同,Swift 的构造器无需返回值,它们的主要任务是保证新实例在第一次使用前完成正确的初始化. 类实例也可以通过定义析构器(deinitializer)在类实例释放之前执行特定的清除工作.想了解更多关于

进击的雨燕-------------类和结构体

类和结构体是人们构建代码所用的一种通用且灵活的构造体.我们可以使用完全相同的语法规则来为类和结构体定义属性(常量.变量)和添加方法,从而扩展类和结构体的功能. 与其他编程语言所不同的是,Swift 并不要求你为自定义类和结构去创建独立的接口和实现文件.你所要做的是在一个单一文件中定义一个类或者结构体,系统将会自动生成面向其它代码的外部接口. 注意通常一个类的实例被称为对象.然而在 Swift 中,类和结构体的关系要比在其他语言中更加的密切,本章中所讨论的大部分功能都可以用在类和结构体上.因此,我