LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 788|回复: 3

关于汇编的问题

[复制链接]
发表于 2005-7-9 11:00:50 | 显示全部楼层 |阅读模式
. 表示什么? [] 如何解释?

集中体现在下面的一小段程序中:

  1.      15     call    .L2
  2.      16 .L2:
  3.      17     popl    %ecx
  4.      18     addl    $_GLOBAL_OFFSET_TABLE_+[.-.L2], %ecx
复制代码


大概的意思是获得运行时 _GLOBAL_OFFSET_TABLE_ 符号的绝对地址,放在ecx中

这里, . 表示什么? 好像at&t汇编中没有[]啊,这里的[]又表示什么意思呢?
发表于 2005-7-9 11:31:36 | 显示全部楼层

  1.         call    .L2
  2. .L2:
  3.         popl    %ecx
复制代码

这三句好理解。就是获取标号.L2,也就是popl %ecx这条指令的地址,然后保存在%ecx中。这种做法是一个常见的汇编技巧。至于最后这一句,我用as编译后再用objdump -d反汇编出来是这样:

  1. 16:   e8 00 00 00 00          call   1b <_start+0x1b>
  2. 1b:   59                            pop    %ecx
  3. 1c:   81 c1 03 00 00 00      add    $0x3,%ecx
复制代码

我想可以把 $_GLOBAL_OFFSET_TABLE_+[.-.L2]理解成符号_GLOBAL_OFFSET_TABLE_所在的地址减去标号.L2所在的地址之差。%ecx加上这个差之后,其值正好等于_GLOBAL_OFFSET_TABLE_所在的地址。
在汇编出来的程序中,标号.L2的地址为1b,符号_GLOBAL_OFFSET_TABLE_的地址我想应该是81 c1 03 00 00 00中03这个字节所在的位置,也就是1e,这样减下来,正好是3。
我也没有找到资料,纯属瞎猜。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-7-9 11:42:43 | 显示全部楼层
Post by kj501

  1.         call    .L2
  2. .L2:
  3.         popl    %ecx
复制代码

这三句好理解。就是获取标号.L2,也就是popl %ecx这条指令的地址,然后保存在%ecx中。这种做法是一个常见的汇编技巧。

嗯,没错.
Post by kj501

至于最后这一句,我用as编译后再用objdump -d反汇编出来是这样:

  1. 16:   e8 00 00 00 00          call   1b <_start+0x1b>
  2. 1b:   59                            pop    %ecx
  3. 1c:   81 c1 03 00 00 00      add    $0x3,%ecx
复制代码

我想可以把 $_GLOBAL_OFFSET_TABLE_+[.-.L2]理解成符号_GLOBAL_OFFSET_TABLE_所在的地址减去标号.L2所在的地址之差。%ecx加上这个差之后,其值正好等于_GLOBAL_OFFSET_TABLE_所在的地址。
在汇编出来的程序中,标号.L2的地址为1b,符号_GLOBAL_OFFSET_TABLE_的地址我想应该是81 c1 03 00 00 00中03这个字节所在的位置,也就是1e,这样减下来,正好是3。
我也没有找到资料,纯属瞎猜。

我也做了这样的反汇编,我们先不管他的整体意思是什么,我想搞清楚这个 . 究竟表示什么,还有这个[]又表示什么咧?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-7-9 12:11:15 | 显示全部楼层
嗯,这个样子
. 表示当前指令所在地址
那个[]可以换成(),即可以这样写: $_GLOBAL_OFFSET_TABLE_+(.-.L2),加号不能省略,猜测这里的括号是不是起到运算优先级的作用
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表