免费注册 查看新帖 |

Chinaunix

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

请教,X64平台上,写一个C程序,为什么用32bits来存放变量的地址? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-07-06 17:36 |只看该作者 |倒序浏览

X64平台上,写一个C程序,为什么用32bits来存放变量的地址?
如下的gval1的地址(第6行,对应bf 00 00 00 00          mov    $0x0,%edi)
如果链接的时候把gval1放在高于4G的地址空间中,那不是程序就不对了?
gcc为什么不用 mov reg, imm64而用mov reg, imm32指令呢?
  1. # cat -n 1.c
  2.      1  long int gval1 = 567;
  3.      2  long int gval2 = 763;
  4.      3  long int simple_l(long int *p, long int v);
  5.      4  long int call_simple_l()
  6.      5  {
  7.      6      long int z = simple_l(&gval1, 12L);
  8.      7      return z + gval2;
  9.      8  }
  10. # gcc -c -O3 1.c
  11. # objdump -d 1.o

  12. 1.o:     file format elf64-x86-64


  13. Disassembly of section .text:

  14. 0000000000000000 <call_simple_l>:
  15.    0:   48 83 ec 08             sub    $0x8,%rsp
  16.    4:   be 0c 00 00 00          mov    $0xc,%esi
  17.    9:   bf 00 00 00 00          mov    $0x0,%edi
  18.    e:   e8 00 00 00 00          callq  13 <call_simple_l+0x13>
  19.   13:   48 03 05 00 00 00 00    add    0x0(%rip),%rax        # 1a <call_simple_l+0x1a>
  20.   1a:   48 83 c4 08             add    $0x8,%rsp
  21.   1e:   c3                      retq

复制代码
gcc 版本
  1. # gcc -v
  2. Using built-in specs.
  3. Target: x86_64-suse-linux
  4. Configured with: ../configure --prefix=/usr --infodir=/usr/share/info --mandir=/usr/share/man --libdir=/usr/lib64 --libexecdir=/usr/lib64 --enable-languages=c,c++,objc,fortran,obj-c++,java,ada --enable-checking=release --with-gxx-include-dir=/usr/include/c++/4.3 --enable-ssp --disable-libssp --with-bugurl=http://bugs.opensuse.org/ --with-pkgversion='SUSE Linux' --disable-libgcj --disable-libmudflap --with-slibdir=/lib64 --with-system-zlib --enable-__cxa_atexit --enable-libstdcxx-allocator=new --disable-libstdcxx-pch --enable-version-specific-runtime-libs --program-suffix=-4.3 --enable-linux-futex --without-system-libunwind --with-cpu=generic --build=x86_64-suse-linux
  5. Thread model: posix
  6. gcc version 4.3.4 [gcc-4_3-branch revision 152973] (SUSE Linux)
复制代码

论坛徽章:
0
2 [报告]
发表于 2012-07-07 13:42 |只看该作者
I got it.

使用-mcmodel={large,medium,kernel,small} 来控制
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP