免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2176 | 回复: 3
打印 上一主题 下一主题

关于一段C程序的疑问 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-09-11 10:54 |只看该作者 |倒序浏览
本帖最后由 hanshu830 于 2012-09-11 11:01 编辑

我声明2个全局变量, 想计算2个变量之间偏移,

但是gcc翻译成的汇编, 把两个变量地址相减的结果右移了两位才输出。

以下是C代码:
  1. int start = 1;
  2. int end = 2;
  3. int a()
  4. {
  5.         int off;

  6.         off = &end - &start;

  7. }
复制代码
以下是 x86_gcc 翻译的汇编结果
  1. Disassembly of section .text:

  2. 0000000000000000 <a>:
  3.    0:   55                      push   %rbp
  4.    1:   48 89 e5                mov    %rsp,%rbp
  5.    4:   ba 00 00 00 00          mov    $0x0,%edx
  6.                         5: R_X86_64_32  end
  7.    9:   b8 00 00 00 00          mov    $0x0,%eax
  8.                         a: R_X86_64_32  start
  9.    e:   48 89 d1                mov    %rdx,%rcx
  10.   11:   48 29 c1                sub    %rax,%rcx
  11.   14:   48 89 c8                mov    %rcx,%rax
  12.   17:   48 c1 f8 02             sar    $0x2,%rax
  13.   1b:   89 45 fc                mov    %eax,-0x4(%rbp)
  14.   1e:   c9                      leaveq
  15.   1f:   c3                      retq

  16. Disassembly of section .data:

  17. 0000000000000000 <start>:
  18.    0:   01 00                   add    %eax,(%rax)
  19.         ...

  20. 0000000000000004 <end>:
  21.    4:   02 00                   add    (%rax),%al
  22.         ...
复制代码
以下是 arm-eabi-gcc4.4.3的结果
  1. Disassembly of section .text:

  2. 00000000 <a>:
  3.    0:   e52db004        push    {fp}            ; (str fp, [sp, #-4]!)
  4.    4:   e28db000        add     fp, sp, #0      ; 0x0
  5.    8:   e24dd00c        sub     sp, sp, #12     ; 0xc
  6.    c:   e59f2018        ldr     r2, [pc, #24]   ; 2c <a+0x2c>   //取 end变量的地址
  7.   10:   e59f3018        ldr     r3, [pc, #24]   ; 30 <a+0x30> //取 start变量的地址
  8.   14:   e0633002        rsb     r3, r3, r2                              //相减
  9.   18:   e1a03143        asr     r3, r3, #2                             //算术右移 2位
  10.   1c:   e50b3008        str     r3, [fp, #-8]                          //付值给 off
  11.   20:   e28bd000        add     sp, fp, #0      ; 0x0
  12.   24:   e8bd0800        pop     {fp}
  13.   28:   e12fff1e        bx      lr
  14.         ...
  15.                         2c: R_ARM_ABS32 end
  16.                         30: R_ARM_ABS32 start

  17. Disassembly of section .data:

  18. 00000000 <start>:
  19.    0:   00000001        .word   0x00000001

  20. 00000004 <end>:
  21.    4:   00000002        .word   0x00000002
复制代码

论坛徽章:
0
2 [报告]
发表于 2012-09-11 13:44 |只看该作者
本帖最后由 azfa123 于 2012-09-11 13:45 编辑

晕,公司不能提交代码,算了。

论坛徽章:
0
3 [报告]
发表于 2012-09-11 14:38 |只看该作者
off = (char *)&end - (char *)&start;

论坛徽章:
0
4 [报告]
发表于 2012-09-11 14:48 |只看该作者
本帖最后由 hanshu830 于 2012-09-11 14:50 编辑

回复 3# ShadowStar

谢谢,ShadowStar兄, 强转后结果正确了

看来编译统计的长度是  length / sizeof(type)

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

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP