[英]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
我希望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
我沒有看過實際的匯編代碼,但是在任何小型字節序計算機上,您都會得到您提到的結果。 十六進制輸出將始終從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.