2017-04-10 45 views
0

我想問你我該怎麼做位操作&,< <,>>,| |在組裝中。我知道輪班和輪換意見,但我不知道用這個做熱門。我可以用C編寫它,但我不知道如何在彙編中實現。你能幫我解決這個問題嗎?裝配中的位操作

編輯:爲Intel x86

感謝

void shifting_in_C(unsigned short n) 
{ 
    unsigned char a = n & 255; 
    unsigned char b = n >>8; 
    unsigned char c = (n << 8) 
    unsigned char d = (n << 8) | 255; 
} 
+0

編譯_C_代碼並查看生成的彙編代碼? –

+2

對於哪個CPU?查找產品指導手冊 – James

+0

已被編輯。對於Intel x86 – Matey

回答

3

你需要考慮一個你正在試圖完成的時刻。人們普遍認爲,「如果我可以用匯編編寫它,速度會更快。」這似乎是有道理的,因爲彙編是處理器實際說話的語言,對嗎?

但是,這忽略了一個事實,即編譯器的目的是將高級語言轉換爲彙編程序。編譯器知道各種關於如何從處理器中獲得最佳性能的技巧和怪癖,而這需要您多少年才能掌握。

因此,如果目標是通過將代碼寫入彙編程序來使代碼的一部分運行得更快,那麼您需要確保可以比編寫編譯器的嚮導編寫彙編程序更好。這有可能發生。但更常見的是你自己編寫的代碼會變慢。

但是,如果目標是更多地瞭解計算機和彙編程序,那就去做吧。

也就是說......

你正在尋找的x86彙編指令,一旦你開始尋找直通可用的指令很明顯的。 Here's x86指令參考(不一定是最好的,只是第一個谷歌提供的)。

看你的例子:

  • 尋呼通的列表中,我們看到被描述爲「邏輯與」
  • SHR他們形容爲「轉移」,而更正確地將被描述爲「移AND指令對。」
  • SHL它也被描述爲「Shift」,但實際上是「左移」。
  • 您的最後一個示例包含2個操作。第一個是SHL,第二個是OR

如果您打算在彙編程序中做很多工作,您應該花點時間通過引用來調整參考以熟悉各種指令。

FWIW。

0
void shifting_in_C(unsigned short n) 
{ 
    unsigned char a = n & 255; 
    unsigned char b = n >>8; 
    unsigned char c = (n << 8) 
    unsigned char d = (n << 8) | 255; 
} 


push ebx 
; unsigned char a = n & 255; 
mov al, [esp + 8] 
; unsigned char b = n >>8; 
mov bl, [esp + 9] 
; unsigned char c = (n << 8) 
xor cl, cl ;(constant overflow) 
; unsigned char d = (n << 8) | 255; 
xor dl, dl ;(constant overflow) 
dec dl 
pop ebx 
ret 

我想你想要這樣的:

unsigned short bswap16(unsigned short n) 
{ 
    return ((n & 0xFF) << 8) | (n >> 8) & 0xFF; 
} 

mov ax, [esp + 4] 
xchg al, ah 
ret 
+1

如果它正在交換@Matey正在查找的字節,我們還應該考慮'__builtin_bswap16'或['_byteswap_ushort'](https://msdn.microsoft.com/en-us/library/a3140177.aspx)(取決於編譯器)。 –