标题:Linux汇编基础疑问求助,很基础的入门问题。自学就是不好啊!
只看楼主
chaoc
Rank: 1
等 级:新手上路
帖 子:46
专家分:0
注 册:2012-10-20
结帖率:71.43%
已结贴  问题点数:60 回复次数:5 
Linux汇编基础疑问求助,很基础的入门问题。自学就是不好啊!
小弟以前学过8086汇编,准确的说是看过王爽的那本书。
现在在深入学习C语言,想在linux用汇编分析一下C语言各种变量的存储位置,用gcc -S hello.c生成的汇编代码却看不大懂,与我在网上查到的AT&T风格的汇编教程有一点不符啊。所以来请教一下各位高手。

我用的环境是ubuntu 12.04 x64

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变量名字的改编吗?

[ 本帖最后由 chaoc 于 2013-10-4 16:51 编辑 ]
搜索更多相关主题的帖子: color Linux linux C语言 ubuntu 
2013-10-04 16:50
xkwy0000
Rank: 6Rank: 6
等 级:贵宾
威 望:11
帖 子:107
专家分:441
注 册:2013-2-8
得分:20 
只知道linux的功能非常强大,看了上面的代码也觉得很有趣,祝你深入研究下去
2013-10-05 15:25
chaoc
Rank: 1
等 级:新手上路
帖 子:46
专家分:0
注 册:2012-10-20
得分:0 
回复 2楼 xkwy0000
so,just this?
can you help me?
2013-10-05 17:39
lock69
Rank: 2
等 级:论坛游民
帖 子:17
专家分:47
注 册:2009-9-23
得分:20 
找AT&T的教程吧,跟INTEL的格式是不同的
2013-10-06 22:03
xkwy0000
Rank: 6Rank: 6
等 级:贵宾
威 望:11
帖 子:107
专家分:441
注 册:2013-2-8
得分:0 
按理说手工编制的程序比机器编译出来的效率上应该提高30%以上,
不过最近的提法是并不差,实际感觉也是如此,值得研究
2013-10-07 19:23
Explorerlxz
Rank: 9Rank: 9Rank: 9
来 自:zzu
等 级:蜘蛛侠
威 望:4
帖 子:302
专家分:1032
注 册:2013-4-24
得分:20 
呵呵,不懂Linux汇编!楼主win32汇编学的怎么样了?我感觉学习应该循序渐进,先把windows玩好了,再转换平台
2013-10-07 21:58



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-421447-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.023747 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved