簡體   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