节 |
含义 |
.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
分享到:
相关推荐
总共4个文件,2000多行的代码,其中sca.c是词法,p.c生成语法树,table.c是符号表,g.c是转化成具体masm32代码,只支持char,short,int,double四种类型数据,其他的有兴趣的可以自己修改增加,由于masm32限制,目前该...
[TakeLionOS汇编与C语言自学笔记-第六课] 版权所有 2021年 江志剑 按照《21天学通C语言》(第七版),有如下一个例子P17。 将整个程序的代码,包括行号显示出来: //1、files:hellolistit.c hellolistitno.s ...
可以把0~9和数码管可以显示的字母生成C代码或汇编代码,直接点复制到Keil 中粘贴就可以了。以把注释部份做好了,很好用的工具哦!下面给出示例大家看看 本工具由我自己用E语言编程开发,在Win7,XP系统上调试过...
汇编, 破解, 反编译, 机器指令, 汇编指令;
开发工具:VC2、问题描述编译整数四则运算表达式,将整数四则运算表达式翻译为汇编语言代码。消除左递归后的文法:E→TE’E’→+TE’ |εT→FT’T’→*FT’ |εF→(E) | i消除左递归后的翻译模式:E ::= T {E’.i:...
可将C语言的裴波纳契和pi.c的翻译为汇编语言。...3编译器演示程序,可将C语言子集测试程序编译为目标代码——汇编程序,用汇编器转换为二进制程序后运行无误,如斐波那契数列程序,应能翻译为正确的汇编程序。
只能实现斐波那契数列,没有实现pi.c,得分五分 ...3编译器演示程序,可将C语言子集测试程序编译为目标代码——汇编程序,用汇编器转换为二进制程序后运行无误,如斐波那契数列程序,应能翻译为正确的汇编程序。
<br>编译及运行要求:支持 Intel 指令集,支持 C 与汇编混合编译。(如 Windows + VC) <br>缘起:我在 C 标准库里似乎没有找到文本转化为实数的程序。因为要用,只好自己编了一个。为了方便起见,我在程序中...
对应的汇编代码 10: a = c[1]; 00401067 8A 4D F1 mov cl,byte ptr [ebp-0Fh] 0040106A 88 4D FC mov byte ptr [ebp-4],cl 11: a = p[1]; 0040106D 8B 55 EC mov edx,dword ptr [ebp-14h] 00401070 8A 42 01 ...
曾经在某公司做过的代码,虽然代码并不美观,但却是稳定的用在产品中的,经过了大量测试。...注意:编译需要另外下载安装masm32 (http://www.movsd.com/),因为汇编代码需要其中提供的汇编形式的头文件
1.32 下面的代码为什么不能编译? intf(){char a[]="Hello, world!";} 18 *1.33 下面的初始化有什么问题?编译器提示“invalid initializers ”或其他信息。char *p=malloc(10); 19 1.34 char a[]= "string ...
1.32 下面的代码为什么不能编译?intf(){chara[]="Hello,world!";} *1.33 下面的初始化有什么问题?编译器提示“invalidinitializers”或其他信息。char*p=malloc(10); 1.34 chara[]="stringliteral";和char*p=...
(3)将从Nor Flash启动改成从 NAND Flash启动 在文件中找到 195-201 代码,并在 201行后面添加如下代码: 195 copy_loop: 196 ldmia r0!, {r3-r10} /* copy from source address [r0] */ 197 stmiar1!, {r3-r10...
o 2.11 代码 int f() { char a[] = "Hello, world!";} 不能编译。 o 2.12 这样的初始化有什么问题?char *p = malloc(10); 编译器提示 ``非法初始式" 云云。 o 2.13 以下的初始化有什么区别?char a[] = "string ...
clature是使用x86_64 nasm汇编代码生成的一种小型语言。该语言没有类型,仅使用大小。 建造 制定目标 目标 描述 (没有) 符合./clature 查看 在./test/中运行测试脚本 安装 编译到/ usr / bin / ccl并将配置文件...
Illegal character in input file: ''''<char>'''' ($) 在输入文件中的非法字符''''<char>'''' Illegal message method index 非法的消息方法指针 Illegal reference to symbol ''''<Name>'''' in object file ''''...
/*------------------------------------------------------------------------- REG51.H Header file for generic 80C51 and 80C31 microcontroller. Copyright (c) 1988-2001 Keil Elektronik GmbH and Keil ...