您的位置:首页 > 编程语言 > C语言/C++

c++ ,asm一些无聊的事情

2014-09-27 02:41 211 查看
参考,http://blog.csdn.net/feixiaoxing/article/details/6751534

1.编译器在翻译一些语句是,和想象的不同

    char a[]="hello";
00E535B8  mov         eax,dword ptr [string "hello" (0E55868h)]
00E535BD  mov         dword ptr [ebp-10h],eax
00E535C0  mov         cx,word ptr ds:[0E5586Ch]
00E535C7  mov         word ptr [ebp-0Ch],cx
    char b[]="12345678";
00E535CB  mov         eax,dword ptr [string "12345678901" (0E55874h)]
00E535D0  mov         dword ptr [ebp-24h],eax
00E535D3  mov         ecx,dword ptr ds:[0E55878h]
00E535D9  mov         dword ptr [ebp-20h],ecx
00E535DC  mov         dl,byte ptr ds:[0E5587Ch]
00E535E2  mov         byte ptr [ebp-1Ch],dl
    char d[]="123456789012345678901234567890";
00E535E5  mov         ecx,7
00E535EA  mov         esi,offset string "123456789012345678901234567890" (0E55AC8h)
00E535EF  lea         edi,[ebp-4Ch]
00E535F2  rep movs    dword ptr es:[edi],dword ptr [esi]
00E535F4  movs        word ptr es:[edi],word ptr [esi]
00E535F6  movs        byte ptr es:[edi],byte ptr [esi]

第一句,6字节,拆分为,一个dword,一个word;

第二句,9字节,拆分为,两个dword,一个byte;

第三句,31字节,拆分为,7个dword,一个word,一个byte

也就是能凑成dword的,都用dword操作。

2.用非法指针调用成员函数

#include <iostream>

using namespace std;

class Apple
{
public:
void print()
{
cout<<"NULL->print()"<<endl;
return;
}
};
void test2()
{
((Apple*)0)->print();
}

int main()
{
test2();
return 0;
}


上面的代码是可以正常运行的,输出
NULL->print()


3.函数内部

debug编译运行的代码中,函数开头,总会有这样的汇编片段

void test()
{
00E014C0  push        ebp
00E014C1  mov         ebp,esp
00E014C3  sub         esp,110h
00E014C9  push        ebx
00E014CA  push        esi
00E014CB  push        edi
00E014CC  lea         edi,[ebp-110h]
00E014D2  mov         ecx,44h
00E014D7  mov         eax,0CCCCCCCCh
00E014DC  rep stos    dword ptr es:[edi]
...
这两句,

sub  esp,110h

lea  edi,[ebp-110h]

中的数字一般相同。

如果我没猜错的话,应该是为了使未初始化的栈内存空间填充为OxCCCC。

另外,110h=44h*4,可能是函数局部变量空间的大小,也就是该函数在栈上所占的空间(例子中还有16字节用来保存寄存器,开始4字节,结尾12字节,中间夹着110字节)。

函数结束,汇编片段

}
00AC1703  pop         edi
00AC1704  pop         esi
00AC1705  pop         ebx
00AC1706  mov         esp,ebp
00AC1708  pop         ebp
00AC1709  ret


4.函数调用

void test5(int a, int b)
{
int c=a+b;
}
int test6(int a, int b)
{
int c=a+b;
return c;
}
调用片段

test5(1,2);
00191BD8  push        2
00191BDA  push        1
00191BDC  call        test5 (191271h)
00191BE1  add         esp,8
a=test6(3,4);
00191BE4  push        4
00191BE6  push        3
00191BE8  call        test6 (19126Ch)
00191BED  add         esp,8
00191BF0  mov         dword ptr [a],eax
test6的完整翻译

int test6(int a, int b)
{
00191750  push        ebp
00191751  mov         ebp,esp
00191753  sub         esp,0CCh
00191759  push        ebx
0019175A  push        esi
0019175B  push        edi
0019175C  lea         edi,[ebp-0CCh]
00191762  mov         ecx,33h
00191767  mov         eax,0CCCCCCCCh
0019176C  rep stos    dword ptr es:[edi]
int c=a+b;
0019176E  mov         eax,dword ptr [a]
00191771  add         eax,dword ptr [b]
00191774  mov         dword ptr [c],eax
return c;
00191777  mov         eax,dword ptr [c]
}


5.未完待续
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: