std::map在内存中的结构(2)

2021-01-24  本文已影响0人  爱钓鱼的饭桶骑士

    代码Release编译后将exe拖到OD中调试,生成如下汇编代码:

push ebp    ;函数头

mov ebp,esp    ;保存esp指针

and esp,-0x8    ;跳转esp指针

sub esp,0x10    ;开辟4个DWORD空间用以存储变量

lea eax,dword ptr ss:[esp]    取当前esp的地址

mov dword ptr ss:[esp],0x1     ;置当前esp指向的内存地址为0x00000001(因为是用dword长度赋值)----这里是 map的key值

push eax    将eax加入堆栈

lea eax,dword ptr ss:[esp+0xC] 取esp+0xc的地址给eax

mov dword ptr ss:[esp+0x8],TestStru.00A531BC  ;  TestStru.00A531BC是char* "1" 的内存地址,将字符串1的头地址放于esp+0x8中(字符串,顾名思义就是字符数组,一般指\0结尾的字符数组)----这里是 map的value值

push eax    将eax加入堆栈

call TestStru.00A51200  调用map的insert方法

lea eax,dword ptr ss:[esp] 同理

mov dword ptr ss:[esp],0x2 同理 这里是 map的key值

push eax 同理

lea eax,dword ptr ss:[esp+0xC] 同理

mov dword ptr ss:[esp+0x8],TestStru.00A531C0  ;  12 同理 这里是 map的value值

push eax 同理

call TestStru.00A51200 同理

lea eax,dword ptr ss:[esp] 同理

mov dword ptr ss:[esp],0x3 同理 这里是 map的key值

push eax 同理

lea eax,dword ptr ss:[esp+0xC] 同理

mov dword ptr ss:[esp+0x8],TestStru.00A531C4  ;  123 这里是 map的value值

push eax  

call TestStru.00A51200

mov ecx,dword ptr ds:[<&MSVCP140.std::cout>]  ;  msvcp140.std::cout  这里开始调用cout函数,下面的不是我们分析的点,故跳过。

call TestStru.00A51310

xor eax,eax

mov esp,ebp

pop ebp

retn

上一篇下一篇

猜你喜欢

热点阅读