读书人

算法上午茶系列-重温汇编(6)[理解ATamp;T

发布时间: 2012-12-26 14:39:28 作者: rapoo

算法下午茶系列-重温汇编(6)[理解AT&T汇编的节]

首先,我们看一下AT&T汇编各段的意义

?

?

节含义.text已编译程序的机器代码.rodata只读数据,如pintf和switch语句中的字符串和常量值.data已初始化的全局变量.bss未初始化的全局变量.symtab符号表,存放在程序中被定义和引用的函数和全局变量的信息.rel.text当链接器吧这个目标文件和其他文件结合时,.text节中的信息需修改.rel.data被模块定义和引用的任何全局变量的信息.debug一个调试符号表。.line原始C程序的行号和.text节中机器指令之间的映射.strtab一个字符串表,其内容包含.systab和.debug节中的符号表

?

上面列表也许比较抽象,我们从一个C程序生成的中间汇编代码分析:

.file"testcr.c".section.rodata.LC0:.string"xxxx".LC1:.string"%s-----%s".text.globl myprinf.typemyprinf, @functionmyprinf:pushl%ebpmovl%esp, %ebpsubl$40, %espmovl$.LC0, -16(%ebp)movw$31097, -11(%ebp)movb$0, -9(%ebp)movl$.LC1, %eaxleal-11(%ebp), %edxmovl%edx, 8(%esp)movl-16(%ebp), %edxmovl%edx, 4(%esp)movl%eax, (%esp)callprintfleaveret.sizemyprinf, .-myprinf.globl main.typemain, @functionmain:pushl%ebpmovl%esp, %ebpandl$-16, %espsubl$32, %espmovl$1, 28(%esp)callmyprintmovl$0, (%esp)callexit.sizemain, .-main.ident"GCC: (Ubuntu 4.4.3-4ubuntu5) 4.4.3".section.note.GNU-stack,"",@progbits

?

?

内存的常用分配方式有:

第一,静态分配,所有名字在编译时绑定某个存储位置。不能在运行时改变
第二,栈分配,活动时压入系统栈。
第三,堆分配,以任意次序分配

?

?

读书人网 >编程

热点推荐