1.3.2 编译
接下来GCC对hello.i进行编译,命令如下:
$gcc –S hello.i
–o hello.s
编译后产生的汇编文件hello.s内容如下:
.file "hello.c"
.section .rodata
.LC0:
.string "Hello
World!"
.text
.globl main
.type main,
@function
main:
pushl %ebp
movl %esp,
%ebp
andl $-16,
%esp
subl $16,
%esp
movl $.LC0,
%eax
movl %eax,
(%esp)
call printf
movl $0,
%eax
leave
ret
.size main,
.-main
.ident "GCC:
(Ubuntu/Linaro 4.4.4-14ubuntu5) 4.4.5"
.section .note.GNU-stack,"",@progbits
GCC生成的汇编代码的语法是AT&T格式,与Intel格式的汇编有所不同(若要生成Intel格式的汇编代码,使用编译选项“-masm=intel”即可)。比如立即数用“$”前缀,寄存器用“%”前缀,内存寻址使用小括号等。区别最大的是,AT&T汇编指令的源操作数在前,目标操作数在后,这与Intel汇编语法正好相反。本书会在后续章节中详细描述这两种汇编语法格式的区别。
不过我们仍能从中发现高级语言代码中传递过来的信息,比如字符串“Hello World!”、主函数名称main、函数调用call printf等。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。