二进制翻译|交叉编译

时间:2011-03-14 18:19:25

标签: binary translation

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

以存储指令为例,您希望存储值0xAA0xBB0xCC0xDD。 现在在为此编写程序集时,您是否为此编写了两个不同的指令 不同的架构,例如

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

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

或者你为这两种体系结构编写相同的指令,比如st, (reg), 0xAA0xBB0xCC0xDD,并让处理器解析指令,以便它处理系统的字节顺序?

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

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

2 个答案:

答案 0 :(得分:2)

Endianess与如何读取或写入内存无关,而是仅仅意味着当内存被解释为数字时,是最重要的字节的第一个或最后一个。只有算术的实现才能产生差异。

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

答案 1 :(得分:1)

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

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

st (reg), 0xAABBCCDD

如果需要适当的操作码,汇编程序将调整常量。如果您希望使用该操作存储多个单字节值,那么字节顺序就成了问题。比如使用相同的操作码将短的以空字符结尾的字符串"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

但这需要四条指令。