Assembly 移位操作

2018-10-27 12:14 更新

匯編語言允許程序員對數(shù)據(jù)的單個比特位進行操作。一個最常見的的位操作稱為移位。移位操作移動某一個數(shù)據(jù)的比特位的位置。移位可以是向左移(也就是:向最高有效位移動),也可以向右移(最低有效位)。


邏輯移位

邏輯移位是移位中最簡單的類型。它以一種最直接的方式進行移位操作。圖3.1展示了一個字節(jié)的移位操作的例子。

邏輯移位

注意:新進來的比特位總是為0。SHL 和SHR 指令分別用來執(zhí)行邏輯左移和邏輯右移。這些指令允許你移動任意的位數(shù)。位數(shù)可以是一個常量,也可以是儲存在CL寄存器的值。最后從數(shù)據(jù)中移出的比特位儲存在進位標志位中。這有一些代碼例子:

實例1

移位的應用

快速的乘法和除法是移位操作最普遍的應用。回憶在十進制系統(tǒng)中,乘以和除以10的幾次方是非常簡單的,只是移動位而已。在二進制中,乘以和除以2的幾次方也是一樣的。例如:要得到二進制數(shù)10112(或十進制11)的兩倍,只需向左移動一位,得到101102 (或22)。一個除以2的幾次方的除法的商相當于一個右移操作的結果。僅僅是除以2,向右移動一位;除以4(22),向右移動2位;除以8(23,向右移動3位,等等。移位指令非?;A而且比功能相同的MUL 和DIV 指令執(zhí)行要快得多!

實際上,邏輯移位只可以用于無符號數(shù)的乘法和除法。一般它們不能應用于有符號數(shù)??紤]兩個字節(jié)的數(shù)值FFFF(有符號時為?1)。如果它向右邏輯移動一位,結果是7FFF,也就是+32; 767!另一種類型的移位操作可以用在有符號數(shù)上。

算術移位

這些移位操作是為允許有符號數(shù)能快速地執(zhí)行乘以和除以2的幾次方的操作而設計的。它們保證符號位能被正確對待。

SAL 算術左移(Shift Arithmetic Left) - 這條指令只是SHL的同義詞。它實際上被編譯成與SHL一樣的機器代碼。只要符號位沒有因移位而改變,結果就將是正確的。

SAR 算術右移(Shift Arithmetic Right) - 這是一條新的指令,它不會移動操作數(shù)的符號位(也就是: 最高有效位)。其它位被正常移動,除了從左邊新進來的位通過復制符號位(也就是說,如果符號位為1,那么新的位值也同樣為1)得到外。因此,如果一個字節(jié)使用這條指令來移位,只有低7位會被移動。就像其它移位指令一樣,最后移出的位儲存在進位標志位中。

算術移位

循環(huán)移位

循環(huán)移位指令像邏輯指令一樣運作,除了把從數(shù)據(jù)的一端移出的比特位又移入到另一端外。因此,數(shù)據(jù)好像被當作一個循環(huán)結構體一樣對待。ROL和ROR 是兩個最簡單的循環(huán)移位指令,它們分別執(zhí)行左移和右移操作。就像其它移位指令一樣,這些移位指令把循環(huán)移出的最后一個比特位復制到進位標志位中。

循環(huán)移位

有兩個額外的循環(huán)指令用來在數(shù)據(jù)和進位標志位之間移動比特位,它們稱為RCL 和RCR。例如,如果AX寄存器用這些指令來移位,那么有17位用來得到AX,進位標志位也包括在循環(huán)中。

循環(huán)指令

簡單應用

這有一個代碼小片斷,它用來計算在EAX寄存器里\on"(也就是: 1)的比特位有多少個。

簡單應用

上面的代碼毀掉了在EAX中的初值(循環(huán)之后,EAX的值為0)。如果你想保留EAX中的值,那么用rol eax, 1替換第四行即可。
以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號