33,311
社区成员
发帖
与我相关
我的任务
分享
00401000 8B 44 24 08 mov eax,dword ptr [esp+8]
00401004 8B 4C 24 04 mov ecx,dword ptr [esp+4]
00401008 03 C1 add eax,ecx
0040100A C3 ret
0040100B 90 nop
0040100C 90 nop
0040100D 90 nop
0040100E 90 nop
0040100F 90 nop
00401010 8D 04 11 lea eax,[ecx+edx]
00401013 C3 ret
00401014 90 nop
00401015 90 nop
00401016 90 nop
00401017 90 nop
00401018 90 nop
00401019 90 nop
0040101A 90 nop
0040101B 90 nop
0040101C 90 nop
0040101D 90 nop
0040101E 90 nop
0040101F 90 nop
00401020 8B 44 24 08 mov eax,dword ptr [esp+8]
00401024 8B 4C 24 04 mov ecx,dword ptr [esp+4]
00401028 03 C1 add eax,ecx
0040102A C2 08 00 ret 8
0040102D 90 nop
0040102E 90 nop
0040102F 90 nop
00401030 CC int 3 ;这条指令对应紧跟main后加__asm int 3(为方便定位)
00401031 6A 02 push 2
00401033 6A 01 push 1
00401035 E8 C6 FF FF FF call 00401000
0040103A 83 C4 08 add esp,8
0040103D BA 02 00 00 00 mov edx,2
00401042 B9 01 00 00 00 mov ecx,1
00401047 E8 C4 FF FF FF call 00401010
0040104C 6A 02 push 2
0040104E 6A 01 push 1
00401050 E8 CB FF FF FF call 00401020
00401055 33 C0 xor eax,eax
00401057 C3 ret
int __cdecl a1(int p1,int p2) {return p1+p2;}
int __fastcall a2(int p1,int p2) {return p1+p2;}
int __stdcall a3(int p1,int p2) {return p1+p2;}
int main() {
a1(1,2);
a2(1,2);
a3(1,2);
return 0;
}
__cdecl int a1(int p1,int p2) {return p1+p2;}
__fastcall int a2(int p1,int p2) {return p1+p2;}
__stdcall int a3(int p1,int p2) {return p1+p2;}
int main() {
a1(1,2);
a2(1,2);
a3(1,2);
return 0;
}
然后
VC调试时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
(Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
对学习编程者的忠告:
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步源代码千行不如单步对应汇编一行!
不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!