首先,我们看一下AT&T汇编各段的意义
节 |
含义 |
.text |
已编译程序的机器代码 |
.rodata |
只读数据,如pintf和switch语句中的字符串和常量值 |
.data |
已初始化的全局变量 |
.bss |
未初始化的全局变量 |
.symtab |
符号表,存放在程序中被定义和引用的函数和全局变量的信息 |
.rel.text |
当链接器吧这个目标文件和其他文件结合时,.text节中的信息需修改 |
.rel.data |
被模块定义和引用的任何全局变量的信息 |
.debug |
一个调试符号表。 |
.line |
原始C程序的行号和.text节中机器指令之间的映射 |
.strtab |
一个字符串表,其内容包含.systab和.debug节中的符号表 |
上面列表也许比较抽象,我们从一个C程序生成的中间汇编代码分析:
#include <stdio.h>
void main(){
char *x="xxxx";
char y[]="yy";//y的16进制ASCII码是97,9797的十进制为31097
printf("%s-----%s",x,y);
exit(0);
}
我们使用gcc -S testcr.c,查看编译生成的汇编代码(为便于理解,将生成的汇编代码进行了注释)
.file "testcr.c"
.section .rodata
.LC0:
.string "xxxx"#使用char *分配
.LC1:
.string "%s-----%s"
.text
.globl main
.type main, @function
main:
pushl %ebp
movl %esp, %ebp
andl $-16, %esp
subl $32, %esp#分配32字节栈空间,根据变量情况分配
movl $.LC0, 24(%esp)#x变量使用指针(4个字节大小),放入栈中,可以看到,变量分配靠近栈空间的尾部
movw $31097, 29(%esp)#字符'yy'移到main程序的栈中,直接将y变量的值放入栈中
movb $0, 31(%esp)#加上NULL标志,表示字符结束
movl $.LC1, %eax
leal 29(%esp), %edx
movl %edx, 8(%esp)
movl 24(%esp), %edx
movl %edx, 4(%esp)
movl %eax, (%esp)
call printf
movl $0, (%esp)
call exit
.size main, .-main
.ident "GCC: (Ubuntu 4.4.3-4ubuntu5) 4.4.3"
.section .note.GNU-stack,"",@progbits
在MAIN函数中char *分配在只读数据段中,实际使用时,只在程序栈中分配一个指针的空间。char[] 在程序栈中分配空间,然后直接使用movl、movw之类的汇编直接把值放入栈中空间。那么在其它函数中声明的呢,可以从以下程序中看出,仍然如此。
#include <stdio.h>
void myprinf(){
char *x="xxxx";
char y[]="yy";//y的16进制ASCII码是97,9797的十进制为31097
printf("%s-----%s",x,y);
}
void main(){
int num=1;
myprint();
exit(0);
}
生成的中间汇编代码为:
.file "testcr.c"
.section .rodata
.LC0:
.string "xxxx"
.LC1:
.string "%s-----%s"
.text
.globl myprinf
.type myprinf, @function
myprinf:
pushl %ebp
movl %esp, %ebp
subl $40, %esp
movl $.LC0, -16(%ebp)
movw $31097, -11(%ebp)
movb $0, -9(%ebp)
movl $.LC1, %eax
leal -11(%ebp), %edx
movl %edx, 8(%esp)
movl -16(%ebp), %edx
movl %edx, 4(%esp)
movl %eax, (%esp)
call printf
leave
ret
.size myprinf, .-myprinf
.globl main
.type main, @function
main:
pushl %ebp
movl %esp, %ebp
andl $-16, %esp
subl $32, %esp
movl $1, 28(%esp)
call myprint
movl $0, (%esp)
call exit
.size main, .-main
.ident "GCC: (Ubuntu 4.4.3-4ubuntu5) 4.4.3"
.section .note.GNU-stack,"",@progbits
内存的常用分配方式有:
第一,静态分配,所有名字在编译时绑定某个存储位置。不能在运行时改变
第二,栈分配,活动时压入系统栈。
第三,堆分配,以任意次序分配
分享到:
相关推荐
在本文中,我们将深入探讨与标题"AT&T(ORL)、MIT、Yale三大人脸识别数据库,完全"相关的知识点,这些数据库是人脸识别研究的基础。 首先,让我们逐一分析这三大数据库: 1. AT&T(ORL)人脸识别数据库: AT&T实验室...
- **核心概念**:编写汇编语言程序需要熟悉一系列开发工具,包括编译器、链接器等。 - **实际应用**:通过亲手编写和调试汇编程序,可以增强对整个编译过程的理解。 - **1.3.3 提高算法开发技能** - **核心概念**...
### IBM-PC汇编语言程序设计(第五版)——核心知识点解析 #### 一、书籍简介 《IBM-PC汇编语言程序设计(第五版)》是一部深入浅出地介绍IBM-PC环境下汇编语言程序设计的经典教材。本书旨在帮助读者理解和掌握汇编语言...
IBM-PC汇编是针对IBM个人计算机系列(包括兼容机)的汇编语言,它主要用于对硬件进行直接控制,优化性能关键的代码,以及编写操作系统和设备驱动程序。 **实验报告结构** “做好的沈美明主编IBM-PC汇编实验详细...
Unix最初是为PDP-11架构设计的,随后被移植到了多种不同类型的处理器上,包括VAX和68000系列,这些架构上的汇编语言都采用了AT&T格式。当Unix最终移植到i386架构时,自然而然地继承了AT&T的汇编语言风格。 #### 五...
这本书通过一系列的小代码实例,让读者能够亲手实践,从而更好地理解和运用汇编语言。 汇编语言的学习主要包括以下几个方面: 1. **基本概念**:首先,你需要了解汇编语言的基本构成,包括指令、寄存器、地址和...
本文档是关于计算机系统的汇编语言实验报告,旨在通过 LC-3 汇编语言设计实现相关程序,熟悉和理解 LC-3 的汇编语言指令格式,并掌握在 LC-3 仿真平台下汇编语言代码的设计输入和调试过程。 知识点1:汇编语言基础 ...
6. **1-6 算法的反汇编** - **算法转换**:展示了如何将高级语言编写的算法转换为汇编代码。 - **优化建议**:给出了针对特定算法进行优化的具体建议。 通过这些详细的解析和示例,读者不仅可以了解到汇编语言的...
《清风汇编-易语言汇编学习》资料包是一个专注于易语言与汇编结合的学习资源,主要针对游戏辅助开发领域。在这个压缩包中,核心文件是“清风汇编.ec”,这很可能是易语言的一个模块,用于扩展其功能,以便在编写游戏...
理解并掌握AT&T风格的汇编语言不仅有助于深入理解Linux内核的工作原理,还能帮助开发者更好地优化和调试代码。无论是对于操作系统开发者还是嵌入式系统的工程师来说,掌握AT&T汇编语言都是非常有价值的技能。
《IBM-PC汇编语言程序设计》是一本深入探讨IBM个人计算机(IBM-PC)汇编语言编程的经典著作。汇编语言是计算机科学的基础之一,它允许程序员直接对硬件进行控制,实现高效的程序设计。在IBM-PC系统中,汇编语言与x86...
AT89C51微控制器是一种广泛使用的8位微控制器,属于8051系列,由Atmel公司生产。它具备4KB的内部程序存储器(ROM),128字节的内部数据存储器(RAM),以及32个I/O口,具有串行通信接口和定时器/计数器等丰富的外围...
本节内容概述了汇编语言程序设计的基本概念和步骤,包括编写汇编语言程序的步骤、判断程序质量的标准、几种程序结构、子程结构等。 一、编写汇编语言程序步骤 编写汇编语言程序需要遵循一定的步骤,包括: 1. ...
在《数据结构算法与应用--C++语言描述》这本书中,作者深入浅出地介绍了各种基本和高级的数据结构及其对应的算法,并提供了详细的C++实现。以下是基于这个主题的详细知识点讲解: 1. **数组**:数组是最基础的数据...
总的来说,通过MATLAB的遗传算法解决多车场开放式时间窗多商品VRP问题,既需要对遗传算法有深入理解,又需要具备扎实的MATLAB编程技能。这样的问题解决方法不仅在理论上有重要价值,也在实际应用中具有广泛前景,如...
学习和理解易语言中的adler32算法汇编源码,不仅可以提升你在易语言编程方面的技能,还能加深对校验和算法的理解,以及对汇编语言如何与高级语言结合使用的认识。这对于系统级编程和性能优化工作非常有帮助。在实际...
6. **优化**:由于汇编语言的特性,我们可以对代码进行细致的优化,例如减少不必要的指令、使用更高效的算法等,这对于提升游戏性能至关重要。 在“俄罗斯方块汇编源代码.txt”中,我们可以看到实际的代码实现,...
在汇编语言中实现CRC-8,我们需要定义这个生成多项式,并通过一系列位操作(如移位和异或)来计算校验和。 CRC-16则提供更强的校验能力,适用于更复杂的数据传输环境,例如以太网帧的校验。它使用16位的生成多项式...
DES(Data Encryption Standard)算法是一种广泛使用的数据加密标准,由IBM公司在1977年研发。该算法基于块加密,采用64位的明文块和64位的密钥,但实际上只有56位的密钥参与加密过程,因为每轮加密会忽略其中的8位...
- **GCC汇编格式**:GCC采用的是AT&T汇编语法,与常见的Intel汇编语法有所不同。理解这两种语法的区别对于正确使用GCC内联汇编至关重要。 #### 三、AT&T与Intel汇编语法的主要区别 1. **源操作数与目的操作数的...