所以我正在查看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
答案 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"
);