锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
void test1(char **p, char *l)

{
*p = l;
}
void test2(char *p, char *l)

{
p = l;
}
void main()

{
char s[] = "0123456789";
char *p = s;
char *l = s+3;
test1(&p, l);
test2(p, l);
}
娉ㄦ剰浣跨敤**p鏉ヨ揪鍒版洿鏀規晥鏋?br>澶氫竴灞傛寚閽堟寚鍚戯紝鍙互鐢ㄦ潵綆$悊澶栭潰鐨勬寚閽?
]]>
]]>
]]>
#pragma hdrstop
//---------------------------------------------------------------------------
char one()
{
return 'a';
}
//---------------------------------------------------------------------------
__int16 two()
{
return 1;
}
//---------------------------------------------------------------------------
__int32 four()
{
return 2;
}
//---------------------------------------------------------------------------
__int64 eight()
{
return 3;
}
//---------------------------------------------------------------------------
#pragma argsused
int main(int argc, char* argv[])
{
char i = one();
__int16 ii = two();
__int32 iv = four();
__int64 viii = eight();
return 0;
}
//---------------------------------------------------------------------------
鑷繁鍐欑殑灝忓疄楠岋紝鍥犱負紿佺劧瀵筧sm浜х敓浜嗗叴瓚c?br>鍦ㄨ窡韙殑鏃跺欎細鍙戠幇錛?br>
mov al, 0x61 ; return 'a'
mov ax, 0x0001 ; return 1
mov eax, 0x00000002 ; return 2
mov eax, 0x00000003 ; return 3
xor edx, edx
榪欒鏄庯紝瀵逛簬1涓猙yte鐨勬暟鎹敤鐨勬槸al錛?byte鐢ㄧ殑鏄痑x錛?byte鐢ㄧ殑鏄痚ax錛岃?byte鐢ㄧ殑鏄痚ax鍜宔dx錛屼笖eax瀛樺偍浣庝綅錛宔dx瀛樺偍楂樹綅銆?br>
鍙︽湁錛?br>
mov ebp, esp
榪欏湪榪涘叆姣忎釜鍑芥暟閮戒細鍑虹幇錛屾槸鍥犱負ebp鏄爢鏍堟寚閽堬紝鐢ㄦ潵鍦ㄥ爢鏍堜腑鏌ユ壘鏁版嵁錛岃宔sp姘歌繙鎸囧悜鍫嗘爤澶撮儴銆俶ov緇檈bp鐩稿綋浜庣粰浜嗘浣嶅彿錛宔bp灝辨槸鍋忕Щ銆?br>
涓嬮潰鍏充簬閭e嚑涓嚱鏁版爣璇?
#pragma hdrstop
//---------------------------------------------------------------------------
void __cdecl cde(int a, int b)
{
a += b;
}
//---------------------------------------------------------------------------
int __stdcall std(int a, int b)
{
a = a + b;
return a;
}
//---------------------------------------------------------------------------
int __pascal pas(int a, int b)
{
if ( a*b > 30 )
return b;
else
{
a += b;
pas(a, b);
}
}
//---------------------------------------------------------------------------
void __fastcall fst(int a, int b)
{
a += b;
}
//---------------------------------------------------------------------------
#pragma argsused
int main(int argc, char* argv[])
{
cde(1, 2);
std(2, 3);
pas(3, 4);
fst(4, 5);
return 0;
}
//---------------------------------------------------------------------------
鐒跺悗璺熻釜榪涘幓錛?br>
push 0x02
push 0x01
std:
push 0x03
push 0x02
pas:
push 0x03
push 0x04
fst
mov edx, 0x00000005
mov eax, 0x00000004
a += b
mov eax, [ebp+0x0c] ; b
add [ebp+0x08], eax ; b->a
fst
mov [ebp-0x08], edx ; b
mov [ebp-0x04], eax ; a
榪欒鏄庯細
__cdecl鍜宊_stdcall閮芥槸浠庡彸鍚戝乏鍘嬪叆鍙傛暟錛?br>__pascal鏄粠宸﹀悜鍙沖帇鍏ュ弬鏁幫紝
__fastcall鏍規湰灝變笉鐢ㄥ唴瀛樻潵瀛樺偍鍙傛暟錛岀洿鎺ュ瓨鍌ㄥ湪瀵勫瓨鍣ㄩ噷闈紝涓嶈繃鏈鍚庨偅涓猣st鍙互鐪嬪嚭__fastcall榪樻槸鍙堝洖鍒板唴瀛樺幓浜嗭紝榪欑偣涓嶆槸寰堟槑鐧姐?br>鎵浠_fastcall鏄蹇殑澶氾紝鍏朵粬鐨勫彉閲忛兘瀛樺偍鍦ㄥ唴瀛樺尯鍩熶笂錛堜笉鍙兘涓鐩村湪瀵勫瓨鍣紝鍥犱負瀵勫瓨鍣ㄦ槸澶у鍏敤鐨勶級錛屽畠浠鎿嶄綔蹇呴』鍏坢ov鍒板瘎瀛樺櫒涓婃潵錛岃宖st灝變笉鐢紝浣嗘槸鍚屾椂錛氬瘎瀛樺櫒鐨勬暟閲忓緢灝戯紝瀹歸噺寰堝皬銆?br>
榪欓噷鎯沖埌鑷繁涔嬪墠鐨勪竴涓弗閲嶉敊璇紝灝辨槸鍥犱負鍦ㄤ笉鍚岀紪璇戝櫒涓嬪vc鍜宐c瀹冧滑緇欒繖浜涙爣璇嗗嚱鏁扮殑鍚嶇О閮芥槸涓嶄竴鏍風殑錛屾墍浠ュ崈涓囦笉鑳藉彧浠ヤ負瀹冧滑鍙湁鍚嶇О鐨勪笉鍚岋紝榪欐槸涓緢涓ラ噸鐨勯敊璇紝紼嬪簭蹇呯劧浼氭鐨勫緢鎯ㄣ傚叾瀹炲姩鍔ㄦ墜灝辯煡閬撲簡錛実oogle涓婅鐨勯兘鏄煡璇嗙偣錛屾潵鐨勪笉瀹炲湪銆?br>
]]>
褰撶被涓湁铏氬嚱鏁扮殑鏃跺欐墠浼氬緩绔媣ft錛岃繖涓〃閲岄潰鎸夌収欏哄簭錛堜粠0寮濮嬶級鍜岀被閲岄潰鐨勮櫄鍑芥暟鍋氬嚭瀵瑰簲銆?br>濡傛灉涓涓被閲岄潰鏈夎櫄鍑芥暟錛堝氨鏄湁vft錛夛紝閭e畠灝辨湁涓獀ptr銆倂ptr鏄竴涓瓨鍦ㄥ湪綾諱腑鐨勪竴涓殣鍚寚閽堬紝榪欎釜鎸囬拡鎸囧悜鐨勬槸vft榪欎釜琛ㄣ?br>褰撹皟鐢ㄧ被涓殑鏌愪釜铏氬嚱鏁扮殑鏃跺欙紝灝遍氳繃榪欎釜鎸囬拡鍘繪壘vft閲岄潰瀵瑰簲鐨勫嚱鏁幫紝鐒跺悗鎷挎潵璋冪敤銆?br>
{
public:
FunctionPointer *__vptr;
virtual void function1() {};
virtual void function2() {};
};
class D1: public Base
{
public:
virtual void function1() {};
};
class D2: public Base
{
public:
virtual void function2() {};
};
榪欓噷鏄劇ず鐨勬妸vptr鏄劇ず鍑烘潵錛屼絾瀹為檯涓婃槸鐪嬩笉瑙佺殑銆?br>
娉ㄦ剰d1鍜宒2鐨剉ptr鏄戶鎵胯嚜base鐨?br>
{
D1 cClass;
Base *pClass = &cClass;
pClass->function1();
}
涓婇潰鐨勪唬鐮佷箣鎵浠ュ彲浠ユ墽琛岋紝鏄洜涓猴細pClass鎸囬拡鎸囧悜鐨勪粎浠呮槸cClass涓睘浜嶣ase鐨勯儴鍒嗭紙鍥犱負Base鏄疍1鐨勭埗綾伙級錛屽洜涓簐ptr鍘熸湰鏄湪Base涓殑錛堣櫧鐒剁湅涓嶈錛夛紝鎵浠Class鏄彲浠ヨ皟鐢╲ptr鐨勩傚啀鐢變簬緇ф壙鐨勫叧緋伙紝姝ゆ椂鐨剉ptr澶勪簬D1綾諱腑錛屽畠鎸囧悜鐨勬槸D1鐨剉ft錛屾墍浠Class->funtion1()榪欏彞鍙互鎵ц鎴愬姛銆?br>
璇翠竴涓鏉傜殑鎯呭喌錛?br>
{
public:
virtual void a();
};
class B : public A
{
public:
virtual void a();
virtual void c();
virtual void f();
};
class C : public A
{
public:
virtual void e();
};
class D : public B, public C
{
public:
void a();
void g();
}:
榪欓噷灝辨湁鐐歸棶棰橈紝濡傛灉鍗曠函鐨剉ft涓寜鐓у嚱鏁伴『搴忕殑璇濄傚湪D榪欎釜綾諱腑錛屾潵鑷狟鍜屾潵鑷狢榪欎袱涓被涓殑B::c鍑芥暟鍜孋::e鍑芥暟鍦ㄤ粬浠殑綾諱腑鎵鍦ㄧ殑浣嶇疆浠庢枃鏈笂鐪嬮兘鏄浜岀殑浣嶇疆錛圕綾昏繕鏈変釜A涓戶鎵跨殑a鍑芥暟錛夈傞偅涔堝浜嶥鏉ヨ鏈夊悓涓涓綅緗湁涓や釜鍑芥暟錛岃繖鏃秜ft蹇呯劧涓嶈兘姝e父瀹炵幇銆傚湪C++涓叾瀹濪榪欎釜綾繪湁涓や釜vft錛屼竴涓熀浜嶣寤虹珛錛屼竴涓熀浜嶤寤虹珛銆傚綋鐒惰繖縐嶆儏鍐典笅鍙湁鍦ㄥ緇ф壙鏃舵墠鍑虹幇銆?br>
閭d箞鍦ㄥ疄闄呰繍琛屾椂錛岄鍏堣鎶妚ft鐨勫湴鍧錛堜篃灝辨槸vptr鐨勫鹼級鏀懼埌瀵勫瓨鍣ㄩ噷闈紝鐒跺悗瑕佺‘瀹氱敤鐨勬槸鍝釜綾葷殑vft錛堝浜嶥榪欎釜綾繪潵璇達級錛屾帴鐫鍐嶇儲寮曡繖涓嚱鏁拌〃鎵懼埌鍑芥暟錛屾渶鍚庢墠鏍規嵁鍦板潃鎵ц鍑芥暟銆?br>
涔熷氨鍙浜庡緇ф壙榪欑澶嶆潅鐨勬儏鍐典笅錛屾墠鏈変笂闈㈣繖涔堝姝ラ銆傚浜庡崟緇ф壙錛屽彧鐢ㄦ壘鍒拌〃錛屾壘鍒扮儲寮曪紝鎵懼埌鍑芥暟錛岃皟鐢ㄥ嵆鍙侴CC鐨則hunk鍦ㄥ緩绔媣ft鐨勬椂鍊欏氨紜畾浜嗗埌搴曡繖涓嚱鏁版槸鍦ㄥ摢涓璞?br>
load [table_reg+#deltaOffset], delta_reg
load [table_reg+#numOffset], method_reg
add object_reg, delta_reg, object_reg
call method_reg
涓婇潰鐨勬眹緙栧彇鑷竴綃囪鏂囷紝VFToffset灝辨槸vft鐨勫湴鍧鍋忕Щ錛宒eltaOffset灝辨槸澶氱戶鎵夸駭鐢熺殑鍋忕Щ錛堥夊摢涓被錛孊榪樻槸C錛夛紝numOffset灝辨槸鍑芥暟鍋忕Щ銆傜渷鍘葷殑灝辨槸2銆?榪欎袱鏉¤鍙ワ紝thunk鎶婅繖姝ュ仛浜嗐?br>
鍏充簬thunk榪樻槸鏈夌偣闂錛屼笉鏄潪甯告槑鐧姐?br>
]]>
float f; // global variable
int main()
{
double d; // local variable
}
鍙橀噺f鐨勮寖鍥村彲浠ヨ鏄痝lobal涔熷彲浠ヨ瓚呭嚭浜嗘墍鍦ㄦ枃浠躲傛瘡涓彉閲忛兘鏈変竴涓繛鎺ュ睘鎬э紝鐢ㄤ簬鍦ㄨ繛鎺ユ椂鍒ゆ柇鍏朵粬鏂囦歡鏄惁鏈夋潈鍒╂寚鍚戣繖涓彉閲忋傝繖閲岀殑f澹版槑錛宑++榛樿緇欏畠浜嗕竴涓繛鎺ュ睘鎬э細extern錛屼篃灝辨槸璇村湪鍏朵粬鏂囦歡涓紝鍙互浣跨敤榪欎釜鍙橀噺錛屽綋鐒跺墠鎻愭槸浣犲寘鍚簡姝ゆ枃浠訛紝鎴栬呭湪涓涓伐紼嬮噷闈紙鍥犱負瀹冩槸榪炴帴灞炴э級銆傚浜庡彉閲弉錛屽墠闈㈢殑static瀵艱嚧榪欎釜鍙橀噺鐨勮繛鎺ュ睘鎬т負錛氭鏂囦歡錛屽氨鏄澶栭儴鏂囦歡鏃犳硶浣跨敤瀹冦?br>
static涔嬫墍浠ュ紩璧鋒販娣嗭紝鏄洜涓轟竴寮濮嬪鐨勬椂鍊欙紝瀹冪殑搴旂敤鍦ㄤ簬鎶婁笂闈㈣繖涓猟錛岃繖涓眬閮ㄥ彉閲忓彉鐨勫浐瀹氥傝鍒皊tatic蹇呯劧鏈変釜渚嬪瓙錛屾槸鍦ㄥ嚱鏁頒腑鏈変釜灞閮ㄥ彉閲忥紝鐒跺悗澹版槑涓簊tatic錛屾帴鐫鑷錛屼箣鍚庣濂囩殑鍙戠幇鍙橀噺灞呯劧娌℃湁鑷姩閲婃斁銆傝繖鍏跺疄榪樻槸涓眬閮ㄥ彉閲忥紝鍑轟簡鍑芥暟鏄病娉曚嬌鐢ㄧ殑銆?br>
瀵逛簬extern錛屽父鐢ㄧ殑鍋氭硶榪樻湁錛?br>
]]>