首先,我们看一下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汇编语言手册2015是一本专注于x86架构汇编语言的重要参考资料,尤其对于那些寻求最新知识的开发者和技术爱好者来说,这是一份不可多得的资源。AT&T汇编语言与Intel汇编语言有所不同,其语法和指令表示方式有其...
AT&T 汇编语言与 GCC 内嵌汇编简介 AT&T 汇编语言是一种常用的汇编语言,它的语法与 Intel 汇编语言有所不同。GCC 内嵌汇编是指在高级语言(如 C、C++)中嵌入汇编语言的代码,以提高程序的执行效率。在本文中,...
在本文中,我们将深入探讨与标题"AT&T(ORL)、MIT、Yale三大人脸识别数据库,完全"相关的知识点,这些数据库是人脸识别研究的基础。 首先,让我们逐一分析这三大数据库: 1. AT&T(ORL)人脸识别数据库: AT&T实验室...
- **核心概念**:编写汇编语言程序需要熟悉一系列开发工具,包括编译器、链接器等。 - **实际应用**:通过亲手编写和调试汇编程序,可以增强对整个编译过程的理解。 - **1.3.3 提高算法开发技能** - **核心概念**...
为了更好地理解和使用这些汇编代码,有必要了解AT&T汇编与Intel汇编之间的区别。 ##### 1. 前缀 在Intel汇编中,寄存器和立即数没有特定的前缀。而在AT&T汇编中,寄存器前面会加上百分号`%`,立即数前面则加美元...
IBM-PC汇编是针对IBM个人计算机系列(包括兼容机)的汇编语言,它主要用于对硬件进行直接控制,优化性能关键的代码,以及编写操作系统和设备驱动程序。 **实验报告结构** “做好的沈美明主编IBM-PC汇编实验详细...
本文档是关于计算机系统的汇编语言实验报告,旨在通过 LC-3 汇编语言设计实现相关程序,熟悉和理解 LC-3 的汇编语言指令格式,并掌握在 LC-3 仿真平台下汇编语言代码的设计输入和调试过程。 知识点1:汇编语言基础 ...
6. **1-6 算法的反汇编** - **算法转换**:展示了如何将高级语言编写的算法转换为汇编代码。 - **优化建议**:给出了针对特定算法进行优化的具体建议。 通过这些详细的解析和示例,读者不仅可以了解到汇编语言的...
《清风汇编-易语言汇编学习》资料包是一个专注于易语言与汇编结合的学习资源,主要针对游戏辅助开发领域。在这个压缩包中,核心文件是“清风汇编.ec”,这很可能是易语言的一个模块,用于扩展其功能,以便在编写游戏...
理解并掌握AT&T风格的汇编语言不仅有助于深入理解Linux内核的工作原理,还能帮助开发者更好地优化和调试代码。无论是对于操作系统开发者还是嵌入式系统的工程师来说,掌握AT&T汇编语言都是非常有价值的技能。
《IBM-PC汇编语言程序设计》是一本深入探讨IBM个人计算机(IBM-PC)汇编语言编程的经典著作。汇编语言是计算机科学的基础之一,它允许程序员直接对硬件进行控制,实现高效的程序设计。在IBM-PC系统中,汇编语言与x86...
本节内容概述了汇编语言程序设计的基本概念和步骤,包括编写汇编语言程序的步骤、判断程序质量的标准、几种程序结构、子程结构等。 一、编写汇编语言程序步骤 编写汇编语言程序需要遵循一定的步骤,包括: 1. ...
6. **优化**:由于汇编语言的特性,我们可以对代码进行细致的优化,例如减少不必要的指令、使用更高效的算法等,这对于提升游戏性能至关重要。 在“俄罗斯方块汇编源代码.txt”中,我们可以看到实际的代码实现,...
在汇编语言中实现CRC-8,我们需要定义这个生成多项式,并通过一系列位操作(如移位和异或)来计算校验和。 CRC-16则提供更强的校验能力,适用于更复杂的数据传输环境,例如以太网帧的校验。它使用16位的生成多项式...
DES(Data Encryption Standard)算法是一种广泛使用的数据加密标准,由IBM公司在1977年研发。该算法基于块加密,采用64位的明文块和64位的密钥,但实际上只有56位的密钥参与加密过程,因为每轮加密会忽略其中的8位...
通过实例习题的练习,比如计算1234H与AFH的和,以及7ABH与6FH的乘积,读者可以加深对汇编语言中算术指令的理解,并熟练地进行位运算操作。这是进行更复杂算法实现的基础。 ASCII码作为计算机中字符编码的标准,它的...
同时,汇编也常被用于编写性能敏感的代码段,例如图形渲染、加密算法或游戏引擎中的关键部分。 虽然现代编程更多依赖于高级语言,但理解汇编语言仍然是提升编程技能和深入理解计算机工作原理的重要步骤。通过学习...
第四章 MCS-51汇编语言程序设计主要探讨了如何使用汇编语言来编写针对MCS-51系列单片机的程序。汇编语言是一种低级编程语言,它的指令直接对应于计算机的机器指令,因此对于单片机的硬件控制具有很高的效率。相比...
《Brennan's Guide to Inline Assembly》是一本深入探讨内联汇编的指南,主要针对的是AT&T汇编和Intel汇编的区别。汇编语言是计算机科学中的底层编程语言,它与机器语言直接对应,程序员通过汇编语言可以直接对硬件...
粒子群算法及其工业应用-钱锋著,是本电子书,讲解的比较详细