我目前正在将使用MIPSPro为SGI编写和编译的一段代码移植到带有gcc 4.4.7的RHEL 6.7中。我的目标体系结构是x86_64,我能够为此代码生成可执行文件,现在我正在尝试运行它。

我正在尝试从文件中读取二进制数据,该文件是在SGI系统中通过基本上将对象的指针转换为char*并将其保存到文件中而生成的。我尝试读取的二进制数据或多或少具有以下格式:

[ Header, Object A , Object B, ..., Object N ]


每个对象是不同类的实例。

代码当前处理文件的方式是将其全部读取到内存中,然后将指针指向对象的起始位置,并使用reinterpret_class<Class A>(pointer)对其进行处理。某些信息告诉我,最初设计此功能的人并不关心可移植性。

到目前为止,我只需要交换字节就可以处理Header对象的字节序。不幸的是,对象A,B,..,N都包含double类型的字段,并且尝试对8个字节进行字节交换似乎不起作用。

那么我的问题是,SGI / MIPSPro中的双精度结构与Linux中的结构是否有所不同?我知道SGI机器中的sizeof(double)返回8,所以我认为它们的大小相同。

最佳答案

根据the MIPSPro ABI


  MIPS处理器符合IEEE 754浮点标准


您的目标平台x86_64, shares this quality

因此,double表示两个平台上的IEEE-754双精度浮点数。

当涉及字节序时,x86_64处理器是低字节序的。但是,根据the MIPSpro assembly programmers' guide,某些MIPSPro处理器是大端的:


  对于R4000和更早的系统,字节顺序可配置为big-endian或little-endian字节顺序(配置在硬件复位期间进行)。当配置为大端优先系统时,字节0始终是最高有效(最左侧)字节。当配置为小字节序系统时,字节0始终是最低有效(最右边的字节)。
  
  目前,R8000 CPU仅支持big-endian


因此,您将必须检查原始平台的数据表,并查看是否需要任何字节交换。

08-18 09:31