【发布时间】:2014-01-12 13:59:33
【问题描述】:
所以我正在查看memcpy 的汇编指令,我想知道代码中嵌入的汇编指令是否负责在执行memcpy 之后(最高有效字节被更改为最低有效字节) .
http://www.opensource.apple.com/source/xnu/xnu-1456.1.26/osfmk/x86_64/bcopy.s
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] 复制到DWORD 变量中,同时将其保留为最高有效字节。 (31-23)
#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;
所以在调用 memcpy 之后,这些值会按以下顺序存储到 DWORD 中。
44434241
如果我在删除 CLD 指令的同时创建了一个自定义 memcpy 函数将保留字节顺序或将其替换为 SLD 将是获得所需结果的可行解决方案。
41424344
【问题讨论】:
-
Memcpy() 从不改变字节顺序。破解 CLD 只会使您的代码崩溃。你在初始化 Octet[] 时出错了。
-
英特尔处理器是小端的,所以你得到的正是预期的(即,在多字节数中,第一个字节将是最不重要的)。如果您想将数字从 big-endian 转换为当前主机使用的任何值,请考虑使用类似
ntohl的内容。 -
一个 char 数组没有字节序,所以谈论这个甚至没有意义。
标签: c++ assembly x86 endianness