GCC可以生成带源代码行号的汇编么?该怎么解决
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把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)
------解决方案--------------------
------解决方案--------------------
- Assembly code
.686P .XMM include listing.inc .model flat INCLUDELIB LIBCMT INCLUDELIB OLDNAMES CONST SEGMENT $SG3846 DB '%d', 0aH, 00H CONST ENDS PUBLIC ?func@test@@QAEHHHH@Z ; test::func PUBLIC _main EXTRN _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 ENDS END