能力值:
( LV2,RANK:10 )
2 楼
楼主下回用code把你的代码框起来
能力值:
( LV2,RANK:10 )
3 楼
C++确实很高效!不过个人感觉C#更好用一些
能力值:
(RANK:680 )
4 楼
LS的是搞.NET的吧,呵呵。
你要知道好用的东西并不一定就是最好的东西。
我两年前搞的也是C#,做ASP.NET开发,做完几个项目后就没沾.NET了。
个人认为目前C#还无法和C++比较。虽然托管代码势头现在越来越猛,但在某些方面还是必须得
使用本机代码。
能力值:
( LV2,RANK:10 )
5 楼
哦~~跟帖学习~嚎~
能力值:
( LV2,RANK:10 )
6 楼
感谢基础知识的讲解
能力值:
( LV2,RANK:10 )
7 楼
把局部类变成全局类,再看看代码,加深理解
#include <stdio.h>
#pragma pack(1)
struct F
{
char a;
int b;
void fuck();
};
#pragma pack()
struct B
{
int a;
int b;
int c;
void add(int,int);
void f(int);
};
void B::add(int a,int b)
{
c = a + b ;
}
void B::f(int x)
{
a += x;
}
void F::fuck()
{
this->a = 'J' ;
this->b++;
}
enum EE
{
red =3,
blue ,
green,
yellow,
}; B sb; F sf; EE ee; //把局部类变成全局类,再看看代码,加深理解 int main(int argc, char* argv[])
{
sb.a = 3;sb.b = 4;sb.c = 5;
sf.a = 'X' ; sf.b = 0x9999;
sf.b = green; __asm int 3 //跟failwest学的, 呵呵, 感觉不错.
printf("%d ",sizeof(sb));
printf("%d ",sizeof(sf));
printf("%d ",sizeof(ee));
sb.add(sb.a,sb.b);
sb.f(4);
sf.fuck();
return 0;
} 00401030 C705 E0984000 0>mov dword ptr [4098E0], 3 //全局类的成员赋值
0040103A C705 E4984000 0>mov dword ptr [4098E4], 4
00401044 C705 E8984000 0>mov dword ptr [4098E8], 5
0040104E C605 F0984000 5>mov byte ptr [4098F0], 58
00401055 C705 F1984000 0>mov dword ptr [4098F1], 5
0040105F CC int3
00401060 6A 0C push 0C
00401062 68 30704000 push 00407030 ; ASCII "%d "
00401067 E8 54000000 call 004010C0
0040106C 6A 05 push 5
0040106E 68 30704000 push 00407030 ; ASCII "%d "
00401073 E8 48000000 call 004010C0
00401078 6A 04 push 4
0040107A 68 30704000 push 00407030 ; ASCII "%d "
0040107F E8 3C000000 call 004010C0
00401084 A1 E4984000 mov eax, [4098E4] //全局类取值
00401089 8B0D E0984000 mov ecx, [4098E0]
0040108F 83C4 18 add esp, 18
00401092 50 push eax
00401093 51 push ecx ; test.004070B8
00401094 B9 E0984000 mov ecx, 004098E0 //全局类地址
00401099 E8 62FFFFFF call 00401000
0040109E 6A 04 push 4
004010A0 B9 E0984000 mov ecx, 004098E0
004010A5 E8 66FFFFFF call 00401010
004010AA B9 F0984000 mov ecx, 004098F0
004010AF E8 6CFFFFFF call 00401020
004010B4 33C0 xor eax, eax
004010B6 C3 retn
能力值:
( LV2,RANK:10 )
8 楼
C++也好,C#也好,都有各自的优点和缺点,尺有所长,寸有所短,关键要看用于什么
感谢楼主提供这么好的基础教学
能力值:
(RANK:680 )
9 楼
非常感谢dssz的指点。
说实话这个系列能得到优秀真的是有点让我受宠若惊,它差优秀还是有距离的,我想版主更多的是对我的鼓励。
说是教学,不如说是交流,因为在这方面我的经验也很少。
就像刚才dssz指出的,我就完全没考虑到。
谢谢大家的支持以及对文中的错误及不足的指正 。
能力值:
( LV2,RANK:10 )
10 楼
跟着楼主逆向分析C++
能力值:
( LV2,RANK:10 )
11 楼
很适合像我等新手学习! LZ太过谦虚了!
能力值:
( LV2,RANK:10 )
12 楼
当你在反汇编代码中看到某些call在调用前都会有个ecx作为参数传进去(这里IDE假定为VC,因为Borland不是用ecx而是通过堆栈来传递this指针的)???
这是因为调用方式不同。Borland用的是fastcall。你在VC中用void WINAPI B::add(int a,int b)看看。
能力值:
( LV9,RANK:610 )
13 楼
LZ这样的方法只适用debug,release不是这样的的,所有的变量是需要的时候才初始化,不需要的根本就不编译进去,这个取决主MAIN代码
还有一看这样的就确定ECX是this指针
00401082 6A 04 push 4
00401084 8D4D EC lea ecx,dword ptr ss:[ebp-14] ; sb的地址.
00401087 E8 84FFFFFF call lesson1.00401010 ; sb.f(4);
至于何时用mov 何时用lea,LZ自己探索好了,我不说了~~^_^
00401036 C745 EC 0300000>mov dword ptr ss:[ebp-14],3 ; 从这5行可以看出,在栈里面是按局部变量从小到大排的
0040103D C745 F0 0400000>mov dword ptr ss:[ebp-10],4
00401044 C745 F4 0500000>mov dword ptr ss:[ebp-C],5
0040104B C645 F8 58 mov byte ptr ss:[ebp-8],58 ; 这里从8开始一个char
LZ这个排序不一定的,有的时候会变一下的~!在debug中多半都会这样,但在release中不一定,debug也不一定的~!
LZ的贴不错,希望继续,我已经学习完了~~!
LZ的一个地方是错的asm->c->c++,这个是不对的~~!
asm->c++
asm->delphi
asm->c
这个是根据原代码来确定的,不一定非要先C.
能力值:
( LV2,RANK:10 )
14 楼
不错的文章学习一下。