URN Logo
UNIX Resources » Linux » China Linux Forum » CPU 与 编译器 » 4 » 从编译器的角度看字符串
announcement 声明: 本页内容为中国Linux论坛的内容镜像,文章的版权以及其他所有的相关权利属于中国Linux论坛和相应文章的作者,如果转载,请注明文章来源及相关版权信息。
Resources
China Linux Forum(finished)
Linux Forum(finished)
FreeBSD China(finished)
linuxforum.net
  业界新闻与评论
  自由软件杂谈
  IT 人生
  Linux软件快递
  翻译作坊
  Linux图书与评论
  GNU Emacs/XEmacs
  Linux 中文环境和中文化
  Linux桌面与办公软件
  Linux 多媒体与娱乐版
  自由之窗Mozilla
  笔记本电脑上的Linux
  Gentoo
  Debian 一族
  网络管理技术
  Linux 安装与入门
  WEB服务器和FTP服务器
  域名服务器和邮件服务器
  Linux防火墙和代理服务器应用
  文件及打印服务器
  技术培训与认证
  Linux内核技术
  Linux 嵌入技术
  Linux设备驱动程序
  Linux 集群技术
  LINUX平台数据库
  系统和网络安全
  CPU 与 编译器
  系统计算研究所专栏
  Linux下的GUI软件开发
  C/C++编程版
  PHP 技 术
  Java&jsp技术
  Shell编程技术
  Perl 编 程
  Python 编 程
  XML/Web Service 技术
  永远的Unix
  FreeBSD世界
   
从编译器的角度看字符串
从编译器的角度看字符串 - EricFisher [2006-04-30 17:09 | 3,227 byte(s)]
 
Re: 从编译器的角度看字符串 - daiyuwen [2006-05-08 14:54 | 263 byte(s)]
 
Re: 从编译器的角度看字符串 - EricFisher [2006-05-08 16:53 | 84 byte(s)]
 
Subject: 从编译器的角度看字符串
Author: EricFisher    Posted: 2006-04-30 17:09    Length: 3,227 byte(s)
[Original] [Print] [Top]
以下讨论,基于Mips o32 ABI, 个人感觉x86下也很类似。

源程序如下:
/* test.c */

int main(void)
{
char *a=(char *)malloc(4);
char *b="xxx";
char c[4]="xxx";

a[0]='x';
b[0]='x';
c[0]='x';
c++;
}

运行mips-elf-gcc -c test.c
运行mips-elf-objdump -D test.o | less
反汇编代码如下:
Disassembly of section .text:


00000000 <main>:
0: 27bdffd8 addiu sp,sp,-40
4: afbf0024 sw ra,36(sp)
8: afbe0020 sw s8,32(sp)
c: 03a0f021 move s8,sp
10: 24040004 li a0,4
14: 0c000000 jal 0 <main>
18: 00000000 nop
1c: afc20010 sw v0,16(s8)
20: 3c020000 lui v0,0x0
24: 24420000 addiu v0,v0,0
28: afc20014 sw v0,20(s8)
2c: 3c020000 lui v0,0x0
30: 8c420000 lw v0,0(v0)
34: 00000000 nop
38: afc20018 sw v0,24(s8)
3c: 8fc30010 lw v1,16(s8)
40: 24020078 li v0,120
44: a0620000 sb v0,0(v1)
48: 8fc30014 lw v1,20(s8)
4c: 24020078 li v0,120
50: a0620000 sb v0,0(v1)
54: 24020078 li v0,120
58: a3c20018 sb v0,24(s8)
5c: 03c0e821 move sp,s8
60: 8fbf0024 lw ra,36(sp)
64: 8fbe0020 lw s8,32(sp)
68: 27bd0028 addiu sp,sp,40
6c: 03e00008 jr ra
70: 00000000 nop
Disassembly of section .data:
Disassembly of section .rodata:

00000000 <.rodata>:
0: 78787800 0x78787800

堆栈布局如下:
------
| | sp+40
------
| ra | 36
------
| s8 | 32
------
| | 28
------
| c | 24
------
| b | 20
------
| a | 16
------
| | 12
------
| | 8
------
| | 4
------
| | sp
------

可以看出,由于a,b,c都是内部变量,因此是保存在栈中的。
16(s8)中存放着指针a,a指向有malloc在堆上分配的空间(heap)。
20(s8)中存放着指针b,b指向只读数据段.rodata中的字符串"xxx"。
24(s8)是字符串数组c的起始位置,依次存放了从.rodata中加载的字符串"xxx"。

因此,
a[0]='x'; 是针对堆空间的写操作,是正确的。
b[0]='x'; 是针对只读空间的写操作,是错误的。
c[0]='x'; 是针对栈空间的写操作,是正确的。
c++;
数组c的名字只是一个地址常量24(s8),并没有在栈中或其他内存中保存c值,所以是错误的。
[Original] [Print] [Top]
Subject: Re: 从编译器的角度看字符串
Author: daiyuwen    Posted: 2006-05-08 14:54    Length: 263 byte(s)
[Original] [Print] [Top]
c++ 这句是错误的。它的类型是
char c[4];

从编译器角度来讲,不是一个“左值”, 不能做加法,再赋给自己的。只能这样:

char *p = c;

p++;

你编译的时候,没有出错吗?

[Original] [Print] [Top]
Subject: Re: 从编译器的角度看字符串
Author: EricFisher    Posted: 2006-05-08 16:53    Length: 84 byte(s)
[Original] [Print] [Top]
嗯,应该去掉“c++;”这一句。估计当初编译时,这句是后加的,没有保存更新,所以通过了。
[Original] [Print] [Top]
« Previous thread
[求救]==>有谁知道哪里有AT&T汇编指令手册啊
CPU 与 编译器
4
Next thread »
这款机器是多核还是两个双核还是4 CPU 的SMP,RH9上Cat出来的
     

Copyright © 2007 UNIX Resources Network, All Rights Reserved.      About URN | Privacy & Legal | Help | Contact us
备案序号: 京ICP备05006143    webmaster: webmaster@unixresources.net
This page created on 2008-07-17 03:47:15, cost 0.070618867874146 ms.