std::map在内存中的结构(2)
代码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