Linux汇编基础知识疑问求助!

善良超锅锅 2013-10-04 04:53:32
小弟以前学过8086汇编,准确的说是看过王爽的那本书。
现在在深入学习C语言,想在linux用汇编分析一下C语言各种变量的存储位置,用gcc -S hello.c生成的汇编代码却看不大懂,下载了电子书,发现书也不能解答我的疑问,hello.s与我在网上查到的AT&T风格的汇编教程好像有一点不符啊。所以来请教一下各位高手。

hello.c的代码如下:什么没干只是定义了很多变量。
int a = 100;
short int b = 200;

int c;
short int d;

static int e = 300;
static short int f = 400;

static int g;
static short int h;

const int i = 500;
const short int j = 600;

const int k;
const short int l;

char *str = "hello world!";
int main()
{
int m = 700;
short int n = 800;

int o;
short int p;

static int q = 900;
static short int r = 1000;

const int s = 1100;
const short t = 1200;

const int u;
const short int v;

char *str2 = "hello China!";
return 0;
}


gcc -S hello.c生成的汇编代码如下:
.file        "hello.c"
.globl a
.data
.align 4
.type a, @object
.size a, 4
a: ;不太理解的是a:后面应该只跟a的东西,可是根据对齐方式,发现b的东西也在下面
.long 100
.globl b;这里是b的定义了,为什么不另外抬头,难道只是gcc生成时没考虑到这一点?
.align 2
.type b, @object
.size b, 2
b:
.value 200
.comm c,4,4
.comm d,2,2
.align 4
.type e, @object
.size e, 4
e:
.long 300
.align 2
.type f, @object
.size f, 2
f:
.value 400
.local g
.comm g,4,4
.local h
.comm h,2,2
.globl i
.section .rodata
.align 4
.type i, @object
.size i, 4
i:
.long 500
.globl j
.align 2
.type j, @object
.size j, 2
j:
.value 600
.comm k,4,4
.comm l,2,2
.globl str
.LC0:
.string "hello world!"
.data
.align 8
.type str, @object
.size str, 8
str:
.quad .LC0
.section .rodata
.LC1:
.string "hello China!"
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
movl $700, -12(%rbp)
movw $800, -4(%rbp)
movl $1100, -8(%rbp)
movw $1200, -2(%rbp)
movq $.LC1, -24(%rbp)
movl $0, %eax
popq %rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size main, .-main
.data
.align 2
.type r.1604, @object
.size r.1604, 2
r.1604:
.value 1000
.align 4
.type q.1603, @object
.size q.1603, 4
q.1603:
.long 900
.ident "GCC: (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3"
.section .note.GNU-stack,"",@progbits



我不知道这个结构是怎么安排的,网上所linux汇编的基本结构是这样的:
程序基本结构
.data
...
.bss
...
.text
.global _start
_start:
...
1.为什么我没有在hello.s中看到.bss符号?

2.照理说,a和b的地位是平等的,为什么语句.globl a在.data的前面,.data好像把a的定义分隔成了两半,这是怎么回事?a,b不应该一起定义吗?

3..type和.size是什么意思?.type e,@object是说e是个普通变量吗?而.type main,@functon是说main是个函数?.size j,2是说j的占用内存2个字节吗?

4. .value和.long是同一个意思吗?都是表示变量的初始化值吗?

5. .comm又是什么意思?.comm h,2,2是说变量h占用大小为2,按2个字节对齐吗?.comm和.bss有什么关系吗?

6.这种汇编定义变量(也许我说“变量”这个词,用错了术语)好像不是按类型批量定义,而是一个一个的定义,而且看起来好没条理,我学8086的时候都是集中在一个段中定义变量的。
比如b的定义
.globl b ;意思是b是一个全局变量?
.align 2 ;对齐方式?
.type b,@object ;b是一个对象,不是函数?
.size b,2 ;b占用两个字节?
b: ;我最不理解这里,为什么b:不出现在整个b定义的最前面
value 200 ;b的初始化值?

为什么不像下面这样定义呢?
b:
.globl
.align 2
.type @boject
.size 2
value 200

7. .LC0,LC1,LFB0,LFE0是什么意思?

8. r.1604 q.1603只是 r q变量名字的改编吗?
...全文
512 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 11 楼 shimachao 的回复:
[quote=引用 10 楼 wangdahu888 的回复:] 给你说过了呀,叫readelf
你没说啊,我只能从截图中看到readelf。 后来终于知道你用的工具是objdump和readelf, 而不是你推荐的EDB,而且你把EDB写成EDG了。 拜托回答问题认真一点。[/quote] 不好意思
善良超锅锅 2013-10-09
  • 打赏
  • 举报
回复
引用 10 楼 wangdahu888 的回复:
给你说过了呀,叫readelf
你没说啊,我只能从截图中看到readelf。 后来终于知道你用的工具是objdump和readelf, 而不是你推荐的EDB,而且你把EDB写成EDG了。 拜托回答问题认真一点。
  • 打赏
  • 举报
回复
代码被加载到内存空间以后,全局变量,局部静态变量等,都放在.data段了
  • 打赏
  • 举报
回复
引用 2 楼 shimachao 的回复:
终于有人回了。 [quote=引用 1 楼 wangdahu888 的回复:] 1.为什么我没有在hello.s中看到.bss符号? 您看到的是汇编代码呀,.bss只是一个段名,两者不相干呀,汇编代码并不代表整个ELF文件的内容呀. 我建议你有linux下用EDG进行动态分析一下
为什么.data 和其他段有呢? EDG是什么?[/quote] .bss段只是为未初始化的全局变量和局部静态变量预留位置而已,它并没有内容,所以它 在文件中也不占据空间。
  • 打赏
  • 举报
回复
给你说过了呀,叫readelf
善良超锅锅 2013-10-08
  • 打赏
  • 举报
回复
引用 6 楼 wangdahu888 的回复:
当你把这个文件编译成.o文件时, static int g; static short int h; 上面这两个变量,确实被放在了.bss段
引用 6 楼 wangdahu888 的回复:
当你把这个文件编译成.o文件时, static int g; static short int h; 上面这两个变量,确实被放在了.bss段
你这个是用的什么工具,好像不是edb
  • 打赏
  • 举报
回复
引用 7 楼 shimachao 的回复:
[quote=引用 6 楼 wangdahu888 的回复:] 当你把这个文件编译成.o文件时, static int g; static short int h; 上面这两个变量,确实被放在了.bss段
这个是用什么工具分析的呢?你上次说的EDG,我百度没搜到啊[/quote] linux 装了gcc之后,都有呀,叫readelf 你上次说的EDG,我百度没搜到啊 http://blog.csdn.net/fjb2080/article/details/5635177
善良超锅锅 2013-10-08
  • 打赏
  • 举报
回复
引用 6 楼 wangdahu888 的回复:
当你把这个文件编译成.o文件时, static int g; static short int h; 上面这两个变量,确实被放在了.bss段
这个是用什么工具分析的呢?你上次说的EDG,我百度没搜到啊
  • 打赏
  • 举报
回复
当你把这个文件编译成.o文件时,
static int g;
static short int h;
上面这两个变量,确实被放在了.bss段
善良超锅锅 2013-10-08
  • 打赏
  • 举报
回复
引用 4 楼 wangdahu888 的回复:
代码被加载到内存空间以后,全局变量,局部静态变量等,都放在.data段了
在汇编代码中总需要吧。 不然要.bss关键字干什么?
善良超锅锅 2013-10-07
  • 打赏
  • 举报
回复
终于有人回了。
引用 1 楼 wangdahu888 的回复:
1.为什么我没有在hello.s中看到.bss符号? 您看到的是汇编代码呀,.bss只是一个段名,两者不相干呀,汇编代码并不代表整个ELF文件的内容呀. 我建议你有linux下用EDG进行动态分析一下
为什么.data 和其他段有呢? EDG是什么?
  • 打赏
  • 举报
回复
1.为什么我没有在hello.s中看到.bss符号? 您看到的是汇编代码呀,.bss只是一个段名,两者不相干呀,汇编代码并不代表整个ELF文件的内容呀. 我建议你有linux下用EDG进行动态分析一下

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧