【问题标题】:Binary translation | Cross compilation二进制翻译 |交叉编译
【发布时间】:2011-03-15 02:27:41
【问题描述】:

假设您正在为不同的架构编写编译器。 架构具有不同的字节顺序。 你有内存读写指令

以存储指令为例,您要在其中存储值 0xAA0xBB0xCC0xDD。 现在在为此编写程序集时,您是否为 不同的架构,例如

对于小端:st (reg), 0xDD0xCC0xBB0xAA

对于大端:st (reg), 0xAA0xBB0xCC0xDD

或者您为两种架构编写相同的指令,例如 st, (reg), 0xAA0xBB0xCC0xDD,并让处理器解析指令以处理系统的字节顺序?

我问这个问题的原因是我不知道当二进制翻译器必须在不同字节序的体系结构之间翻译代码时会做什么。如果在架构 A 中,您看到以下行 st, (reg), XY 您是否将其转换为架构 B 的 st, (reg), YX ?如果是这样,那么内存读取会发生什么?

我想知道如何处理字节顺序,考虑到二进制翻译中的内存读取和写入。

【问题讨论】:

    标签: binary translation


    【解决方案1】:

    Endianess 与内存的读取或写入方式无关,而只是意味着当内存被解释为数字时,它是最重要的字节在前还是最后。只是算术的实现有所不同。

    所以你的二进制翻译器,即使存在这样的东西,也不会改变任何东西,只是像 ADD、SUB 和 MUL 这样的指令以不同的方式解释数字。

    【讨论】:

      【解决方案2】:

      我不确定我是否完全理解你的问题,但听起来你想翻译一些汇编语言代码或反汇编的二进制文件?

      我曾经使用过的每个汇编程序都以理智的方式处理常量的字节顺序。也就是说,如果你想存储0xAABBCCDD,你会这样写:

      st (reg), 0xAABBCCDD
      

      如果需要,汇编器会为适当的操作码调整常量。字节序成为一个问题的地方是您希望使用该操作存储多个单字节值。就像使用相同的操作码将一个短的以 null 结尾的字符串 "123" 写入内存一样。您必须在您的汇编代码中调整该常量,以使其以正确的顺序输出到内存中,以用于小端与大端系统:

      st (reg), 0x31323300 // big-endian
      st (reg), 0x00333231 // little-endian
      

      安全的方法是按照你想要的顺序存储字节:

      stb (reg+0), 0x31
      stb (reg+1), 0x32
      stb (reg+2), 0x33
      stb (reg+3), 0x00
      

      但这需要四个指令。

      【讨论】:

      • 那么问题是如何通过查看汇编模块来区分常量和以空字符结尾的字符串?
      • @n0nChun,我很确定这是不可能的,或者至少是困难的。这几乎相当于读懂了程序员的想法。
      猜你喜欢
      • 1970-01-01
      • 2011-08-25
      • 2018-03-07
      • 1970-01-01
      • 2011-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多