C代码编译成汇编的问题

yu22122 2009-10-20 10:38:17
我用GCC把C代码编译成汇编代码

.file "1.c"
.def ___main; .scl 2; .type 32; .endef
.section .rdata,"dr"
LC0:
.ascii "Hello,World\0"
.text
.globl _main
.def _main; .scl 2; .type 32; .endef
_main:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
andl $-16, %esp
movl $0, %eax
addl $15, %eax
addl $15, %eax
shrl $4, %eax
sall $4, %eax
movl %eax, -4(%ebp)
movl -4(%ebp), %eax
call __alloca
call ___main
movl $LC0, (%esp)
call _printf
leave
ret
.def _printf; .scl 3; .type 32; .endef

就一个简单得打印hello world

高手们,能不能给我注释一下,语句是什么意思...我自己也有看书,但还是想问一下大家,希望有些详细的注释,这样看得明白一点
...全文
273 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
lemirymoo 2009-10-23
  • 打赏
  • 举报
回复
你最好把你的代码做一次O4优化,优化的代码就不会有那么多垃圾代码了。
lemirymoo 2009-10-23
  • 打赏
  • 举报
回复
.file "1.c"
.def ___main; .scl 2; .type 32; .endef ;声明一个32位标号 ___main(从上下文来看这是一个导入符号)
.section .rdata,"dr" ;声明一个只读的数据段
LC0: ;定义一个标号,这个标号里存放字符串"Hello,World\0"
.ascii "Hello,World\0"
.text
.globl _main ;将_main标号声名为全局,既可以再其它obj文件中调用
.def _main; .scl 2; .type 32; .endef ;声明标号_main
_main: ;标号的_main的定义
pushl %ebp ;保存ebp
movl %esp, %ebp ;将esp装到ebp中
subl $8, %esp ;给esp减8
andl $-16, %esp ;将esp最后4位置0 这一步和上一个esp-8的指令是用来做堆栈对齐的。
movl $0, %eax ;eax = 0
addl $15, %eax ;eax += 15
addl $15, %eax ;eax +=15
shrl $4, %eax ;eax>>4
sall $4, %eax ;eax<<4
movl %eax, -4(%ebp) ;把eax值存到ebp-4的位置
movl -4(%ebp), %eax ;把ebp-4位置的值存到eax中
call __alloca ;调用__alloca函数,这个函数一个分配内存的函数 (这应该是一个导入符号,但是没看到显式的声明)
call ___main ;调用导入的___main函数
movl $LC0, (%esp) ;把LC0的字符串指针装入esp所在的位置,(相当于esp-4以后再push LC0)
call _printf ;调用_printf
leave ;=mov ebp,esp和pop ebp
ret ;返回
.def _printf; .scl 3; .type 32; .endef ;声名_printf标号(从上下文来看这是一个导入符号)



我不会AT&T ,不保证一定就正确,你参考看看。
desdouble 2009-10-23
  • 打赏
  • 举报
回复
我自己发的贴子我自己还编辑不了??
desdouble 2009-10-23
  • 打赏
  • 举报
回复
妈呀,注释怎么都这样了啊。郁闷!
desdouble 2009-10-23
  • 打赏
  • 举报
回复
[Quote=引用楼主 yu22122 的回复:]
    我用GCC把C代码编译成汇编代码

.file "1.c" ;C语言的文件名称。
.def ___main; .scl 2; .type 32; .endef ;gcc编译器为_main插入的初始化函数。该
只有当gcc检测到当前的系统不支持 ;constructors 和destructors才会在
编译的时候将该函数插入。具体请参见
gcc手册或以下网址:http://gcc.gnu.org/onlinedocs/gccint/Initialization.html。
如果在编译的时候指定了INIT_SECTION_ASM_OP 便不会出现
;__main函数。


.section .rdata,"dr"
LC0:
.ascii "Hello,World\0" ;以下定义只读字符。字符以'\0'结束。因为C的
字符串常数后面都默认跟着'\0'的.AT&T汇编中可以用.asciz来定义一个后面默认
为'\0'的字符串。.text
.globl _main ;用户在C中定义的main函数。gcc自动将其更名为
;_main。如果直接用汇编语言编写程序,这里一般
是_start.用非_start标记在连接时需要用gcc的
;-E参数指定标识。
.def _main; .scl 2; .type 32; .endef
_main:

pushl %ebp ;实际上,我们的main函数在最终的可执行文件中只是一个被调用的函数而已。我们知道在调用函数时需要做一些入栈和对齐操作,
还有重要的一点就是传递的参数也在栈中。将句的作用是将%ebp入
;栈,之后%ebp中将保存当前的栈指针。movl %esp, %ebp
subl $8, %esp ;%esp减8,该句直到以下的movl -4(%ebp), %eax具体解析 ;请参见http://download.csdn.net/source/1764017文档。
andl $-16, %esp
movl $0, %eax
addl $15, %eax
addl $15, %eax
shrl $4, %eax
sall $4, %eax
movl %eax, -4(%ebp)
movl -4(%ebp), %eax
call __alloca ;从栈中申请空间call ___main ;系统中无constructor和desconstructor则gcc会自动插入该函数.movl $LC0, (%esp) ;将字符串的地址拷贝到%esp所指的内存中,该地址将会传递给printf函数。
call _printf ;调用C库函数printf。
leave ;相当于movl %ebp, %esp popl %ebp,与它相对应的命令是enterret ;main函数执行完毕,返回。
.def _printf; .scl 3; .type 32; .endef

就一个简单得打印hello world 

高手们,能不能给我注释一下,语句是什么意思...我自己也有看书,但还是想问一下大家,希望有些详细的注释,这样看得明白一点
[/Quote]
以上。
谁的谁心疼 2009-10-23
  • 打赏
  • 举报
回复
常期在线,专业接分,楼主莫吝
musiccoder 2009-10-22
  • 打赏
  • 举报
回复
是啊,关注
yu22122 2009-10-22
  • 打赏
  • 举报
回复
那就好..那请问大家能不能帮我注释一两段呢?
yu22122 2009-10-21
  • 打赏
  • 举报
回复
是啊是啊,是 gcc -S生成的,究竟是反汇编 还是宏汇编呢 ?

GCC格式是AT&T 不是intel
gyk120 2009-10-21
  • 打赏
  • 举报
回复
AT&T也是宏汇编,不过汇编指令不同
friendly_ 2009-10-20
  • 打赏
  • 举报
回复
这应该不是反汇编的,是gcc -S 生成的代码.不过是AT&T 格式的和INTEL 格式不太一样.
yu22122 2009-10-20
  • 打赏
  • 举报
回复
咦..这样的啊。。C不是要先编译成汇编么。这样是分两种的么?
gyk120 2009-10-20
  • 打赏
  • 举报
回复
这是反汇编代码,不是宏汇编吧……两者还是有点区别的

21,497

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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