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

算法下午茶系列-重温汇编(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汇编语言有所不同,其语法和指令表示方式有其...

    AT&T汇编语言与GCC内嵌汇编简介[定义].pdf

    AT&T 汇编语言与 GCC 内嵌汇编简介 AT&T 汇编语言是一种常用的汇编语言,它的语法与 Intel 汇编语言有所不同。GCC 内嵌汇编是指在高级语言(如 C、C++)中嵌入汇编语言的代码,以提高程序的执行效率。在本文中,...

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

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

    Linux内核中的汇编语言

    为了更好地理解和使用这些汇编代码,有必要了解AT&T汇编与Intel汇编之间的区别。 ##### 1. 前缀 在Intel汇编中,寄存器和立即数没有特定的前缀。而在AT&T汇编中,寄存器前面会加上百分号`%`,立即数前面则加美元...

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

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

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

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

    天书夜读--汇编语言

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

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

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

    Linux中的汇编语言

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

    IBM-PC汇编语言程序设计

    《IBM-PC汇编语言程序设计》是一本深入探讨IBM个人计算机(IBM-PC)汇编语言编程的经典著作。汇编语言是计算机科学的基础之一,它允许程序员直接对硬件进行控制,实现高效的程序设计。在IBM-PC系统中,汇编语言与x86...

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

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

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

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

    crc-8-16汇编程序

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

    DES算法的汇编语言程序

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

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

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

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

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

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

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

    Brennan's Guide to Inline Assembly

    《Brennan's Guide to Inline Assembly》是一本深入探讨内联汇编的指南,主要针对的是AT&T汇编和Intel汇编的区别。汇编语言是计算机科学中的底层编程语言,它与机器语言直接对应,程序员通过汇编语言可以直接对硬件...

    《粒子群算法及其工业应用-钱锋著pdf

    粒子群算法及其工业应用-钱锋著,是本电子书,讲解的比较详细

    小甲鱼汇编教程

    根据提供的信息,“小甲鱼汇编教程”是一个专注于教授汇编语言编程的教程系列,它由知名编程教育者“小甲鱼”制作。虽然提供的内容片段包含了一些链接和章节标题,但具体的学习材料并未给出。因此,下面将基于这些...

Global site tag (gtag.js) - Google Analytics