将4个字节直接复制到DWORD(MSB变为LSB)

时间:2014-01-12 13:59:33

标签: c++ assembly x86 endianness

所以我正在查看memcpy的汇编指令,我想知道代码中嵌入的汇编指令是否导致({最高有效字节被更改为最低有效字节){{1被执行。

http://www.opensource.apple.com/source/xnu/xnu-1456.1.26/osfmk/x86_64/bcopy.s

memcpy

我希望ENTRY(memcpy) movq %rdx,%rcx shrq $3,%rcx /* copy by 64-bit words */ cld // is this instruction responsible for the MSB being switched to LSB rep movsq movq %rdx,%rcx andq $7,%rcx /* any bytes left? */ rep movsb ret memcpy复制到Octet[0]变量中,同时将其保留为最高有效字节。 (31-23)

DWORD

因此,在调用memcpy后,值按以下顺序存储在#include <iostream> using namespace std; int main() { unsigned char Octet[4]; Octet[0] = 'A'; Octet[1] = 'B'; Octet[2] = 'C'; Octet[3] = 'D'; unsigned int Dword; memcpy( &Dword, Octet, 4); cout << hex << Dword << endl; 中。

DWORD

如果我创建自定义memcpy函数,同时删除44434241 指令将保留字节顺序或用CLD替换它将是获得所需结果的可行解决方案。

SLD

2 个答案:

答案 0 :(得分:0)

我没有看过实际的汇编代码,但是在任何小端计算机上,你都会得到你提到的结果。十六进制输出始终从MSB打印到LSB,在小端计算机上,MSB将是最后一个字节。

听起来你想要的最好是:

Dword = Octet[0] << 24 | Octet[1] << 16 | Octet[2] << 8 | Octet[3];

这是我所知道的将MSB中的Octet [0]降至LSB中的Octet [3]的唯一标准方式。

答案 1 :(得分:0)

所以这是一个快速入侵,但我想知道其他平台是否支持类似于BSWAP的类似指令。

    asm volatile ("movl %1,%%eax;\n"
                  "bswapl %%eax;\n"
                  "movl %%eax, %0;\n"
             : "=r" (Dword)
             : "r" (Dword)
             : "%eax"
             );