首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

GCC可以生成带源代码行号的汇编么?该怎么解决

2012-05-22 
GCC可以生成带源代码行号的汇编么?用GCC把c++代码生成的汇编再作为汇编器的输入,能产生正确的可执行文件么

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)
[解决办法]

探讨
gcc -S 选项生成汇编代码
或者在LINUX下objdump查看汇编代码

[解决办法]
Assembly code
    .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 

热点排行