`
deepfuture
  • 浏览: 4435642 次
  • 性别: Icon_minigender_1
  • 来自: 湛江
博客专栏
073ec2a9-85b7-3ebf-a3bb-c6361e6c6f64
SQLite源码剖析
浏览量:80430
1591c4b8-62f1-3d3e-9551-25c77465da96
WIN32汇编语言学习应用...
浏览量:70947
F5390db6-59dd-338f-ba18-4e93943ff06a
神奇的perl
浏览量:104265
Dac44363-8a80-3836-99aa-f7b7780fa6e2
lucene等搜索引擎解析...
浏览量:287808
Ec49a563-4109-3c69-9c83-8f6d068ba113
深入lucene3.5源码...
浏览量:15192
9b99bfc2-19c2-3346-9100-7f8879c731ce
VB.NET并行与分布式编...
浏览量:68552
B1db2af3-06b3-35bb-ac08-59ff2d1324b4
silverlight 5...
浏览量:32649
4a56b548-ab3d-35af-a984-e0781d142c23
算法下午茶系列
浏览量:46348
社区版块
存档分类
最新评论

算法下午茶系列-重温汇编(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程序生成的中间汇编代码分析:

#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

    AT&T汇编语言手册2015是一本专注于x86架构汇编语言的重要参考资料,尤其对于那些寻求最新知识的开发者和技术爱好者来说,这是一份不可多得的资源。AT&T汇编语言与Intel汇编语言有所不同,其语法和指令表示方式有其...

    Ubuntu下的x86-64汇编(x86-64 Assembly Language with Ubuntu)

    - **核心概念**:编写汇编语言程序需要熟悉一系列开发工具,包括编译器、链接器等。 - **实际应用**:通过亲手编写和调试汇编程序,可以增强对整个编译过程的理解。 - **1.3.3 提高算法开发技能** - **核心概念**...

    做好的沈美明主编IBM-PC汇编实验详细报告

    IBM-PC汇编是针对IBM个人计算机系列(包括兼容机)的汇编语言,它主要用于对硬件进行直接控制,优化性能关键的代码,以及编写操作系统和设备驱动程序。 **实验报告结构** “做好的沈美明主编IBM-PC汇编实验详细...

    linux下的汇编语言

    Unix最初是为PDP-11架构设计的,随后被移植到了多种不同类型的处理器上,包括VAX和68000系列,这些架构上的汇编语言都采用了AT&T格式。当Unix最终移植到i386架构时,自然而然地继承了AT&T的汇编语言风格。 #### 五...

    汇编语言代码大全--精通汇编

    这本书通过一系列的小代码实例,让读者能够亲手实践,从而更好地理解和运用汇编语言。 汇编语言的学习主要包括以下几个方面: 1. **基本概念**:首先,你需要了解汇编语言的基本构成,包括指令、寄存器、地址和...

    计算机系统1-汇编语言实验.docx

    本文档是关于计算机系统的汇编语言实验报告,旨在通过 LC-3 汇编语言设计实现相关程序,熟悉和理解 LC-3 的汇编语言指令格式,并掌握在 LC-3 仿真平台下汇编语言代码的设计输入和调试过程。 知识点1:汇编语言基础 ...

    天书夜读--汇编语言

    6. **1-6 算法的反汇编** - **算法转换**:展示了如何将高级语言编写的算法转换为汇编代码。 - **优化建议**:给出了针对特定算法进行优化的具体建议。 通过这些详细的解析和示例,读者不仅可以了解到汇编语言的...

    清风汇编-易语言汇编学习.rar

    《清风汇编-易语言汇编学习》资料包是一个专注于易语言与汇编结合的学习资源,主要针对游戏辅助开发领域。在这个压缩包中,核心文件是“清风汇编.ec”,这很可能是易语言的一个模块,用于扩展其功能,以便在编写游戏...

    Linux中的汇编语言

    理解并掌握AT&T风格的汇编语言不仅有助于深入理解Linux内核的工作原理,还能帮助开发者更好地优化和调试代码。无论是对于操作系统开发者还是嵌入式系统的工程师来说,掌握AT&T汇编语言都是非常有价值的技能。

    汇编语言-使用汇编实现的飞机大战小游戏-纯汇编实现.zip

    《汇编语言实现的飞机大战小游戏详解》 在计算机科学领域,汇编语言是一种低级编程语言,它直接对应于机器指令集,每个指令都直接控制硬件操作。本项目是用汇编语言纯手工编写的“飞机大战”小游戏,旨在展示汇编...

    第六节-汇编语言程序设计-讲课内容一概述-编写汇编语言程优秀文档.ppt

    本节内容概述了汇编语言程序设计的基本概念和步骤,包括编写汇编语言程序的步骤、判断程序质量的标准、几种程序结构、子程结构等。 一、编写汇编语言程序步骤 编写汇编语言程序需要遵循一定的步骤,包括: 1. ...

    MATLAB-遗传算法-多车场-开放式-带时间窗-多商品-VRP问题

    总的来说,通过MATLAB的遗传算法解决多车场开放式时间窗多商品VRP问题,既需要对遗传算法有深入理解,又需要具备扎实的MATLAB编程技能。这样的问题解决方法不仅在理论上有重要价值,也在实际应用中具有广泛前景,如...

    4-03 汇编语言源程序的汇编.zip

    《4-03 汇编语言源程序的汇编》这一资料主要涵盖了汇编语言的基本概念、汇编过程以及其在计算机系统中的作用。汇编语言是计算机编程的一种低级语言,它与机器语言密切相关,但比机器语言更易读、易编写。下面将详细...

    汇编代码俄罗斯方块 &n多汇编课程设计源码

    6. **优化**:由于汇编语言的特性,我们可以对代码进行细致的优化,例如减少不必要的指令、使用更高效的算法等,这对于提升游戏性能至关重要。 在“俄罗斯方块汇编源代码.txt”中,我们可以看到实际的代码实现,...

    crc-8-16汇编程序

    在汇编语言中实现CRC-8,我们需要定义这个生成多项式,并通过一系列位操作(如移位和异或)来计算校验和。 CRC-16则提供更强的校验能力,适用于更复杂的数据传输环境,例如以太网帧的校验。它使用16位的生成多项式...

    DES算法的汇编语言程序

    DES(Data Encryption Standard)算法是一种广泛使用的数据加密标准,由IBM公司在1977年研发。该算法基于块加密,采用64位的明文块和64位的密钥,但实际上只有56位的密钥参与加密过程,因为每轮加密会忽略其中的8位...

    GCC内联汇编基础.pdf

    - **GCC汇编格式**:GCC采用的是AT&T汇编语法,与常见的Intel汇编语法有所不同。理解这两种语法的区别对于正确使用GCC内联汇编至关重要。 #### 三、AT&T与Intel汇编语法的主要区别 1. **源操作数与目的操作数的...

    IBM-PC汇编语言程序设计答案

    通过实例习题的练习,比如计算1234H与AFH的和,以及7ABH与6FH的乘积,读者可以加深对汇编语言中算术指令的理解,并熟练地进行位运算操作。这是进行更复杂算法实现的基础。 ASCII码作为计算机中字符编码的标准,它的...

    4-01 汇编语言编程概述.zip

    同时,汇编也常被用于编写性能敏感的代码段,例如图形渲染、加密算法或游戏引擎中的关键部分。 虽然现代编程更多依赖于高级语言,但理解汇编语言仍然是提升编程技能和深入理解计算机工作原理的重要步骤。通过学习...

    [CH04]MCS-51汇编语言程序设计1

    第四章 MCS-51汇编语言程序设计主要探讨了如何使用汇编语言来编写针对MCS-51系列单片机的程序。汇编语言是一种低级编程语言,它的指令直接对应于计算机的机器指令,因此对于单片机的硬件控制具有很高的效率。相比...

Global site tag (gtag.js) - Google Analytics