节 |
含义 |
.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
分享到:
相关推荐
- **-funsigned-char**, **-fno-signed-char**, **-fsigned-char**, **-fno-unsigned-char**: 控制字符类型的处理方式,如是否将`char`视为有符号或无符号。 #### GCC的工作流程 GCC在编译过程中涉及四个主要步骤...
- **-funsigned-char**, **-fno-signed-char**, **-fsigned-char**, **-fno-unsigned-char**:这些选项用于指定`char`类型的默认行为。默认情况下,`char`类型是带符号的。使用`-funsigned-char`或`-fsigned-char`...
- **C内联汇编** - C语言中的内联汇编使用方法。 - **volatile限定符** - `volatile`关键字的用途及其重要性。 **20. 链接详解** - **多目标文件的链接** - 如何将多个目标文件链接成一个可执行文件。 - **定义...
3. **汇编**:将汇编语言转换为目标代码(机器代码),生成带有`.o`扩展名的对象文件,这一阶段由`as`(汇编器)负责。 4. **链接**:将多个对象文件链接起来,生成可执行程序或库文件,这一过程由`ld`(链接器)...
3. **汇编**:由汇编器as将汇编代码转化为目标代码(机器代码),生成`.o`文件。 4. **链接**:最后,链接器ld将所有目标代码链接起来,生成最终的可执行程序或库文件。 #### 二、GCC参数详解 - **`-x language ...
- **-funsigned-char/-fno-signed-char/-fsigned-char/-fno-unsigned-char**:这四个选项用于指定 `char` 类型的行为,可以设置为 `unsigned char` 或者 `signed char`。 - **-include file**:包含指定的文件。...
* `-S`:编译源文件,并生成汇编代码。 * `-E`:仅预处理源文件,不编译。 * `-o file`:指定输出文件名。 * `-pipe`:使用管道方式编译,提高编译速度。 * `-v`:显示编译器版本信息。 * `-x language`:指定源文件...
3. **汇编**:汇编代码被转换为机器码,生成目标文件。 4. **链接**:最后,所有目标文件会被链接起来,生成可执行文件或库。 #### 三、gcc/g++命令详解 - **预处理命令**:`gcc -E file.c` - `-E`选项仅进行...
**汇编**: 把汇编代码转换成机器语言的目标文件。 4. **链接**: 将多个目标文件和库文件链接成可执行文件。 - **GCC编译器使用**: - **仅生成目标文件**: - 使用`gcc -c source_file.c -o output_file.o`。 - *...
- **汇编**(`gcc -c *.s -o *.o`):将汇编文件转换为目标文件。 - **链接**(`gcc *.o -o 可执行文件名`):将目标文件链接为可执行文件。 ### 进制转换 - **概念**: 不同进制之间的转换方法。 - **进制表示**: - ...
- 完成以上设置后,编译项目即可生成包含嵌入汇编代码的目标代码。 #### 二、无参数传递的函数调用 在 C51 中调用汇编函数时,无需参数传递的情况较为简单。具体步骤如下: 1. **在 C 文件中声明汇编函数**: -...
- **汇编**: 将汇编语言转换为机器语言的过程。 **示例**: - 高级语言:`X = 2` - 汇编语言:`MOV X, 2` #### 二、编译器在语言处理系统中的位置 - **预处理器**: 处理包含的文件、宏定义等。 - 示例:将`#...
3. **汇编**:汇编器`as`将汇编语言转换为目标代码(机器码),生成`.o`文件。 4. **链接**:链接器`ld`将多个目标文件链接成最终的可执行程序。 #### 三、gcc参数详解 ##### 1. `-x language filename` - **功能...
- **GCC编译器**: 使用`gcc`编译器完成从源代码到可执行文件的转换。 - 直接编译并运行: `gcc ***.c` (默认生成`a.out`可执行文件)。 - 指定输出文件名: `gcc ***.c -o 可执行文件名`。 - **分步编译**: - 预处理...
- 使用内嵌汇编的优势与局限性。 **6.2 基本指令** - 汇编语言的基本指令集介绍。 **6.3 算术指令** - 算术运算指令的种类与应用。 **6.4 逻辑与移位指令** - 逻辑运算指令与移位指令的使用。 **6.5 比较、...
#### 四、源代码分析 下面是修改前后的构造函数对比: ##### 原始构造函数 ```cpp ReservedSpace::ReservedSpace(size_t size, size_t alignment, bool large, bool executable) { initialize(size, alignment, ...
3. **汇编**:将汇编语言转化为目标代码,生成`.o`文件。这是由汇编器as完成的。 4. **链接**:将目标代码链接生成可执行程序。这一步由链接器ld完成。 #### 参数详解 ##### `-x language filename` 该参数用于...