繁体   English   中英

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

[英]Copying 4 bytes directly into a DWORD (MSB becomes LSB)

因此,我正在查看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

我希望memcpyOctet[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

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

听起来最好的方法是:

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

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

因此,这是一个快速的技巧,但是我想知道其他平台是否支持类似于BSWAP的类似指令。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM