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

panpanf1 2008-10-26 08:26:08
用GCC把c++代码生成的汇编再作为汇编器的输入,能产生正确的可执行文件么?
我用vs2008去看vs生成的汇编太不爽了,一个类的函数调用竟然就一个语句:object.foo();郁闷,看来关于类的汇编的细节是compiler specific?机密?不知道看gcc生成的汇编是不是能看到完整的代码,当调用类的函数时能够看到调用过程。
主要是想通过看汇编代码来深入学习c++,但对gcc不熟,请对gcc熟的人指点指点。
...全文
687 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
thunk123 2012-05-21
  • 打赏
  • 举报
回复
哥,你自己在生成的时候都没加调试符号呢
panpanf1 2008-10-26
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 akirya 的回复:]
release编译的时候记得要将优化给去掉.不然啥都看不到了
[/Quote]
我把所有优化去掉了啊,可汇编代码里就如我第一个帖子所说那样。
  • 打赏
  • 举报
回复
release编译的时候记得要将优化给去掉.不然啥都看不到了
panpanf1 2008-10-26
  • 打赏
  • 举报
回复
Hi, All
我弄错了,呵呵
我刚才是在release下编译的,所以只有个object.foo().(不知道为什么)
当我在debug下编译的时候,就有call和函数压栈,以及函数的汇编代码了,谢谢大家了!
  • 打赏
  • 举报
回复
这是GCC的
	.file	"test.cpp"
.section .text$_ZN4test4funcEiii,"x"
.linkonce discard
.align 2
.globl __ZN4test4funcEiii
.def __ZN4test4funcEiii; .scl 2; .type 32; .endef
__ZN4test4funcEiii:
pushl %ebp
movl %esp, %ebp
movl 16(%ebp), %eax
addl 12(%ebp), %eax
addl 20(%ebp), %eax
popl %ebp
ret
.def ___main; .scl 2; .type 32; .endef
.section .rdata,"dr"
LC0:
.ascii "%d\12\0"
.text
.align 2
.globl _main
.def _main; .scl 2; .type 32; .endef
_main:
leal 4(%esp), %ecx
andl $-16, %esp
pushl -4(%ecx)
pushl %ebp
movl %esp, %ebp
pushl %ecx
subl $36, %esp
call ___main
movl $3, 12(%esp)
movl $2, 8(%esp)
movl $1, 4(%esp)
leal -9(%ebp), %eax
movl %eax, (%esp)
call __ZN4test4funcEiii ;这里调用的,直接在栈上传递了参数.
movl %eax, -8(%ebp)
movl -8(%ebp), %eax
movl %eax, 4(%esp)
movl $LC0, (%esp)
call _printf
movl $0, %eax
addl $36, %esp
popl %ecx
popl %ebp
leal -4(%ecx), %esp
ret
.def _printf; .scl 2; .type 32; .endef
  • 打赏
  • 举报
回复


.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

panpanf1 2008-10-26
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 xhs_lh04 的回复:]
806cbb0: e8 61 59 00 00 call 8072516 <_ZNK12MyTemplI4MyClassE12current_sizeEv>
以上是一个类方法调用的指令(gcc)
[/Quote]
谢谢你的回复!
gcc能看到类方法的汇编代码么?call之前没有参数压栈么?(如果类方法带参数)
帅得不敢出门 2008-10-26
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 xhs_lh04 的回复:]
gcc -S 选项生成汇编代码
或者在LINUX下objdump查看汇编代码
[/Quote]
right
gcc -S xx.c
会生成一个.s的汇编代码文件.
xhs_lh04 2008-10-26
  • 打赏
  • 举报
回复
806cbb0: e8 61 59 00 00 call 8072516 <_ZNK12MyTemplI4MyClassE12current_sizeEv>
以上是一个类方法调用的指令(gcc)
xhs_lh04 2008-10-26
  • 打赏
  • 举报
回复
gcc -S 选项生成汇编代码
或者在LINUX下objdump查看汇编代码
e_sharp 2008-10-26
  • 打赏
  • 举报
回复
UP
panpanf1 2008-10-26
  • 打赏
  • 举报
回复
在vs2008中,没有写“call”这个指令,而且当我的成员函数有参数时,也没写函数压栈。同时我在.asm文件中还看不到成员函数的汇编代码,但是普通函数的代码就可以看到
  • 打赏
  • 举报
回复
类函数调用就是那样的.call一个函数地址.

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧