从汇编看c++的虚拟继承以及其内存布局
作者: 发布时间:[ 2013/7/2 10:15:42 ] 推荐标签:
下面是Right构造函数的汇编码:
??0Right@@QAE@HH@Z PROC ; Right::Right, COMDAT
; _this$ = ecx
; 20 : Right(int kk, int ii) : Top(ii) {
push ebp
mov ebp, esp
push ecx;压栈ecx的目的是为了保存对象Right的首地址预留空间
mov DWORD PTR _this$[ebp], ecx;ecx寄存器保存有对象Right的首地址,存放到刚才预留空间
cmp DWORD PTR _$initVBases$[ebp], 0;_$initVBases所代表的内存存放调用Right构造函数时传入的标志,其值为0,说明
;这里将其值与0比较
je SHORT $LN1@Right;如果比较相等,跳转到标号处执行$LN1@Right,不会调用虚基类的构造函数,否则,顺序执行,这里跳转到标号执行
;所有标号之前的语句在构造对象b时都不会执行
mov eax, DWORD PTR _this$[ebp];将对象Right的首地址给寄存器eax
mov DWORD PTR [eax], OFFSET ??_8Right@@7B@;将??_8Right@@7B@的所带表的内存地址(即Right的vtable首地址)写入到对象Right的首地址处内存
mov ecx, DWORD PTR _ii$[ebp];将参数ii的值给寄存器ecx
push ecx;压栈ecx,为调用Top构造函数传递参数
mov ecx, DWORD PTR _this$[ebp];将对象Right首地址给寄存器ecx
add ecx, 8;将对象Right的首地址加8,得到对象Top首地址,作为隐含参数传递给Top的构造函数
call ??0Top@@QAE@H@Z ; 调用Top构造函数
$LN1@Right:
; 21 : k = kk;
mov edx, DWORD PTR _this$[ebp];将Right首地址给寄存器edx
mov eax, DWORD PTR _kk$[ebp];将参数kk的值给寄存器eax
mov DWORD PTR [edx+4], eax;将eax里面的值写入偏移对象Right首地址4byte处,即为成员变量k赋值kk
; 22 : }
mov eax, DWORD PTR _this$[ebp]
mov esp, ebp
pop ebp
ret 12 ; 0000000cH
??0Right@@QAE@HH@Z ENDP
下面是Top函数的汇编码:
??0Top@@QAE@H@Z PROC ; Top::Top, COMDAT
; _this$ = ecx
; 4 : Top(int ii) {
push ebp
mov ebp, esp
push ecx;压栈的目的是为保留对象Top的首地址预留空间
mov DWORD PTR _this$[ebp], ecx;ecx寄存器里面含有对象Top的首地址,存到刚才预留的空间
; 5 : i = ii;
mov eax, DWORD PTR _this$[ebp];将对象Top的首地址给寄存器eax
mov ecx, DWORD PTR _ii$[ebp];将参数ii的值给寄存器ecx
mov DWORD PTR [eax], ecx;将ecx的值写入对象Top首地址处,即给成员变量i赋值ii
; 6 : }
mov eax, DWORD PTR _this$[ebp]
mov esp, ebp
pop ebp
ret 4
??0Top@@QAE@H@Z ENDP
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11