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

char*与char[]-从编译后的汇编代码分析

阅读更多

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

 

1、汇编相关段 的说明在上。

2、C源代码,x为char *,y为char []

 

#include <stdio.h>

void main(){

   char *x="xxxx";

   char y[]="yy";//y的16进制ASCII码是97,9797的十进制为31097

   printf("%s-----%s",x,y);

   exit(0);

}

deepfuture@deepfuture-laptop:~/private/mytest$ 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

 

3、由以上分析可以看出,在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);

}

deepfuture@deepfuture-laptop:~/private/mytest$ gcc -S testcr.c

ASM代码:

 

.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

 

 

 

1
2
分享到:
评论

相关推荐

    gcc命令大全

    - **-funsigned-char**, **-fno-signed-char**, **-fsigned-char**, **-fno-unsigned-char**: 控制字符类型的处理方式,如是否将`char`视为有符号或无符号。 #### GCC的工作流程 GCC在编译过程中涉及四个主要步骤...

    g++命令详解

    - **-funsigned-char**, **-fno-signed-char**, **-fsigned-char**, **-fno-unsigned-char**:这些选项用于指定`char`类型的默认行为。默认情况下,`char`类型是带符号的。使用`-funsigned-char`或`-fsigned-char`...

    一站式学习 C 编程

    - **C内联汇编** - C语言中的内联汇编使用方法。 - **volatile限定符** - `volatile`关键字的用途及其重要性。 **20. 链接详解** - **多目标文件的链接** - 如何将多个目标文件链接成一个可执行文件。 - **定义...

    GCC 参数详解.pdf

    3. **汇编**:将汇编语言转换为目标代码(机器代码),生成带有`.o`扩展名的对象文件,这一阶段由`as`(汇编器)负责。 4. **链接**:将多个对象文件链接起来,生成可执行程序或库文件,这一过程由`ld`(链接器)...

    gcc诠释的中文手册

    3. **汇编**:由汇编器as将汇编代码转化为目标代码(机器代码),生成`.o`文件。 4. **链接**:最后,链接器ld将所有目标代码链接起来,生成最终的可执行程序或库文件。 #### 二、GCC参数详解 - **`-x language ...

    GCC/G++编译命令选项.pdf

    - **-funsigned-char/-fno-signed-char/-fsigned-char/-fno-unsigned-char**:这四个选项用于指定 `char` 类型的行为,可以设置为 `unsigned char` 或者 `signed char`。 - **-include file**:包含指定的文件。...

    GCC 中文手册.pdf

    * `-S`:编译源文件,并生成汇编代码。 * `-E`:仅预处理源文件,不编译。 * `-o file`:指定输出文件名。 * `-pipe`:使用管道方式编译,提高编译速度。 * `-v`:显示编译器版本信息。 * `-x language`:指定源文件...

    gcc and g++编译器和gdb调试器

    3. **汇编**:汇编代码被转换为机器码,生成目标文件。 4. **链接**:最后,所有目标文件会被链接起来,生成可执行文件或库。 #### 三、gcc/g++命令详解 - **预处理命令**:`gcc -E file.c` - `-E`选项仅进行...

    c语言面试指导

    **汇编**: 把汇编代码转换成机器语言的目标文件。 4. **链接**: 将多个目标文件和库文件链接成可执行文件。 - **GCC编译器使用**: - **仅生成目标文件**: - 使用`gcc -c source_file.c -o output_file.o`。 - *...

    C语言知识整理,字符数组

    - **汇编**(`gcc -c *.s -o *.o`):将汇编文件转换为目标文件。 - **链接**(`gcc *.o -o 可执行文件名`):将目标文件链接为可执行文件。 ### 进制转换 - **概念**: 不同进制之间的转换方法。 - **进制表示**: - ...

    keil-C语言与汇编语言混合编程.doc

    - 完成以上设置后,编译项目即可生成包含嵌入汇编代码的目标代码。 #### 二、无参数传递的函数调用 在 C51 中调用汇编函数时,无需参数传递的情况较为简单。具体步骤如下: 1. **在 C 文件中声明汇编函数**: -...

    哈工大编译原理总结(自用)

    - **汇编**: 将汇编语言转换为机器语言的过程。 **示例**: - 高级语言:`X = 2` - 汇编语言:`MOV X, 2` #### 二、编译器在语言处理系统中的位置 - **预处理器**: 处理包含的文件、宏定义等。 - 示例:将`#...

    gcc编译规则

    3. **汇编**:汇编器`as`将汇编语言转换为目标代码(机器码),生成`.o`文件。 4. **链接**:链接器`ld`将多个目标文件链接成最终的可执行程序。 #### 三、gcc参数详解 ##### 1. `-x language filename` - **功能...

    C语言知识梳理,增加函数部分

    - **GCC编译器**: 使用`gcc`编译器完成从源代码到可执行文件的转换。 - 直接编译并运行: `gcc ***.c` (默认生成`a.out`可执行文件)。 - 指定输出文件名: `gcc ***.c -o 可执行文件名`。 - **分步编译**: - 预处理...

    C++游戏编程指南 让你学习2D、3D

    - 使用内嵌汇编的优势与局限性。 **6.2 基本指令** - 汇编语言的基本指令集介绍。 **6.3 算术指令** - 算术运算指令的种类与应用。 **6.4 逻辑与移位指令** - 逻辑运算指令与移位指令的使用。 **6.5 比较、...

    openjdk-research.调试汇编代码1

    #### 四、源代码分析 下面是修改前后的构造函数对比: ##### 原始构造函数 ```cpp ReservedSpace::ReservedSpace(size_t size, size_t alignment, bool large, bool executable) { initialize(size, alignment, ...

    GCC 参数详解

    3. **汇编**:将汇编语言转化为目标代码,生成`.o`文件。这是由汇编器as完成的。 4. **链接**:将目标代码链接生成可执行程序。这一步由链接器ld完成。 #### 参数详解 ##### `-x language filename` 该参数用于...

Global site tag (gtag.js) - Google Analytics