GCC可以生成带源代码行号的汇编么?
用GCC把c++代码生成的汇编再作为汇编器的输入,能产生正确的可执行文件么?
我用vs2008去看vs生成的汇编太不爽了,一个类的函数调用竟然就一个语句:object.foo();郁闷,看来关于类的汇编的细节是compiler specific?机密?不知道看gcc生成的汇编是不是能看到完整的代码,当调用类的函数时能够看到调用过程。
主要是想通过看汇编代码来深入学习c++,但对gcc不熟,请对gcc熟的人指点指点。
[解决办法]
类函数调用就是那样的.call一个函数地址.
[解决办法]
gcc -S 选项生成汇编代码
或者在LINUX下objdump查看汇编代码
[解决办法]
806cbb0: e8 61 59 00 00 call 8072516 <_ZNK12MyTemplI4MyClassE12current_sizeEv>
以上是一个类方法调用的指令(gcc)
[解决办法]
.686P .XMM include listing.inc .model flatINCLUDELIB LIBCMTINCLUDELIB OLDNAMESCONST SEGMENT$SG3846 DB '%d', 0aH, 00HCONST ENDSPUBLIC ?func@test@@QAEHHHH@Z ; test::funcPUBLIC _mainEXTRN _printf:PROC; Function compile flags: /Odtp; File c:\documents and settings\hwp\桌面\test.cpp_TEXT SEGMENT_c$ = -8 ; size = 4_x$ = -1 ; size = 1_main PROC; 21 : { push ebp mov ebp, esp sub esp, 8; 22 : test x;; 23 : int c = x.func( 1,2,3); push 3 push 2 push 1 lea ecx, DWORD PTR _x$[ebp] call ?func@test@@QAEHHHH@Z ; test::func 这不就是call么 mov DWORD PTR _c$[ebp], eax; 24 : printf("%d\n",c); mov eax, DWORD PTR _c$[ebp] push eax push OFFSET $SG3846 call _printf add esp, 8; 25 : return 0; xor eax, eax; 26 : } mov esp, ebp pop ebp ret 0_main ENDP; Function compile flags: /Odtp_TEXT ENDS; COMDAT ?func@test@@QAEHHHH@Z_TEXT SEGMENT_this$ = -4 ; size = 4_a$ = 8 ; size = 4_b$ = 12 ; size = 4_c$ = 16 ; size = 4?func@test@@QAEHHHH@Z PROC ; test::func, COMDAT; _this$ = ecx; 15 : { push ebp mov ebp, esp push ecx mov DWORD PTR _this$[ebp], ecx; 16 : return a+b+c; mov eax, DWORD PTR _a$[ebp] add eax, DWORD PTR _b$[ebp] add eax, DWORD PTR _c$[ebp]; 17 : } mov esp, ebp pop ebp ret 12 ; 0000000cH?func@test@@QAEHHHH@Z ENDP ; test::func_TEXT ENDSEND