i386平台和x86-64平台机器代码的区别
2016-03-29 23:18
330 查看
i386平台和x86_64平台机器代码的区别
By Qianghaohao说明:
在此i386(IA32)指的是Intel32位处理器上硬件和GCC代码的组合.x86_64指代在AMD和Intel的较新的64位处理器上运行的硬件和GCC代码的组合.
x86-64代码与i386机器生成的代码有极大的不同.主要内容如下:
1.指针和长整型数是64位长.整数算术运算支持8,16,32,和64位数据类型.2.通用寄存器组从8个扩展到16个.
3.许多程序状态都保存在寄存器中,而不是在栈上.整型和指针类型的过程参数(最多6个)通过
寄存器传递.有些过程根本不需要访问栈.
4.如果可能,条件操作用条件传送指令实现,会得到比传统分支代码更好的性能.
5.浮点数作用面向寄存器的指令集来实现,而不用IA32支持的基于栈的方法来实现
为了验证以上区别,在x86-64 Linux平台用不同的GCC编译选项来生成不同平台的C代码对应的汇编代码:
测试如下代码:
//文件名:x86-64-IA32.c #include<stdio.h> int main() { int *p; //int型指针变量 long n; //定义长整型变量 printf("size of p = %d\nsize of n = %d\n", sizeof(p), sizeof(n)); return 0; }
一.先在i386 Linux上运行命令:gcc -S -m32 x86-64-IA32.c 产生IA32机器兼容的汇编代码:
当把以上代码编译成可执行代码是输出结果为:
size of p = 4
size of n = 4
二. 在x86-64 Linux上运行命令:gcc -S -m64 x86-64-IA32.c 产生x86-64平台的汇编代码:
当把以上代码编译成可执行代码是输出结果为:
size of p = 8
size of n = 8
总结:从以上结果对比可以看出i386平台和x86-64平台的代码有很大的区别,在i386平台指针类型
和long类型大小都为4,在x64平台指针类型和long类型大小都为8.另外两者产生的汇编代码也不同
在x64平台指令后缀为q,如pushq ,popq等,而在i386位movl,pushl等.至于其他更多的区别可以
写其他测试代码来检验,在此不做过多的介绍.
相关文章推荐
- 解析PHP中VC6 X86和VC9 X86的区别及 Non Thread Safe的意思
- 开源操作系统和必备工具网站收集
- 如何确定操作系统位数(32bit or 64bit)
- 防火墙x86架构和ASIC架构和NP架构的区别
- 2016年中国70%的X86企业服务器将实现虚拟化
- x64 x86 ia64的区别
- 汇编小抄:常用指令
- 《Linux 内核分析》课程作业(1)——计算机基本原理和汇编基础
- ADO CreateParameter 0xC0000005 错误原因及解决方法
- 安全平台,多核动力
- linux下i386,i486,i586,i686的区别
- Linux软件安装之RPM的安装技巧
- x86寄存器说明
- VisualSVN 破解
- 详解4字节对齐
- 怎样在Linux下制作软盘和光盘镜像
- X86-64虚拟机的研究与实现(一)
- 终于可以提前进入64位时代了
- 关于Windows 7的声卡驱动的修复