彙編(十一) 位操作類指令

2021-04-15 01:00:24 字數 2218 閱讀 2507

操作類指令對二進位制的各個位進行操作,包括邏輯運算指令和移位指令。

一、邏輯運算指令

邏輯運算指令用來對字或位元組按位進行邏輯運算,包括邏輯與and、邏輯或or、邏輯非not、邏輯異或xor和測試test五條指令。

1、邏輯與指令and

and  dest,src        ;des←dest∧src(符號∧表示邏輯與)

and指令對兩個運算元執行按位的邏輯與運算:即只有相「與」的兩位都是1,結果才是1;否則,「與」的結果為0。邏輯與的結果送到目的運算元。用and指令可以將乙個位元組或字中的某些特定位清零,或者說將某些位擷取下來。如將ascii碼的高4位清零,亦即擷取低4位,假設這個ascii碼已在al中,則and al,00001111b就會將al中的低4位擷取下來,將al中的高4位清零。其中00001111b稱為邏輯乘常數。and指令及後面介紹的其他雙運算元邏輯指令or、xor和test,源運算元可以是任意定址方式,而目的運算元只能是立即數之外的其他定址方式,並且兩個運算元不能同時為儲存器定址方式。所有雙運算元的邏輯指令均設定cf=of=0,根據結果設定sf、zf和pf狀態,而對af未定義。

2、測試指令test

test dest,src       ;dest∧src(符號∧表示邏輯與)

test指令對兩個運算元執行按位的邏輯與運算,但結果不回送目的運算元。test指令執行的操作與and相同,但不儲存執行結果,只根據結果來設定狀態標誌。test指令通常用於檢測一些條件是否滿足,但又不希望改變源運算元的情況,這條指令之後,一般都是條件轉移指令,目的是利用測試條件轉向不同的程式段。

3、邏輯或指令or

or dest,src      

or指令對兩個運算元執行按位的邏輯或運算:即只要相「或」的兩位有一位是1,結果就是1。or指令可用於置位某些位。

4、邏輯異或指令xor

xor dest,src

相異或的兩位不相同時,結果就是1,否則,異或的結果為0。xor可用於求反某些位,要求求反的位同「1」異或,維持不變的位同「0」異或。xor指令經常給暫存器清0,同時使cf也清零。

xor ax,ax       ;ax=0,cf=of=0,sf=0,zf=1,pf=1

5、邏輯非指令not

not reg/mem     ;reg/mem←~reg/mem(~表示邏輯反)

not指令對運算元按位求反,not指令是乙個單運算元指令,運算元可以是立即數以外的任何定址方式。not指令不影響標誌位。

二、移位指令

1、邏輯移位指令shl和shr

shl reg/mem,1/cl           ;邏輯左移:reg/mem左移1/cl位,最低位補0,最高位進入cf

shr reg/mem,1/cl           ;邏輯右移:reg/mem右移1/cl位,最高位補0,最低位進入cf

2、算術移位指令sal和sar

sal reg/mem,1/cl           ;算術左移,功能與shl相同

sar reg/mem,1/cl           ;算術右移:reg/mem右移1/cl位,最高位不變,最低位進入cf

移位指令按照移入的位設定進製標誌cf,根據移位後的結果影響sf、zf、pf,對af沒有定義。如果進行一位移動,則按照運算元的最高符號位是否改變,相應設定溢位標誌of:如果移位前的運算元最高位與移位後運算元的最高位不同(有變化),則of=1;否則of=0。當移位次數大於1時,of不確定。

邏輯左移指令shl執行一次移位,相當於無符號數的乘2;邏輯右移指令shr執行一位移位,相當於無符號數除以2,商在目的運算元中,餘數由cf標誌反映。算術右移指令sar執行一次移位,相當於有符號數除以2。但應注意,當運算元為負(最高位為1),並且最低位有1移出時,sar指令產生的結果與idiv指令的結果不同。

三、迴圈移位指令

迴圈移位指令類似移位指令,但要從一端移出的位返回到另一端形成迴圈。分成不帶進製標誌迴圈和帶進製標誌迴圈。

1、不帶進製標誌迴圈指令rol和ror

rol reg/mem,1/cl     ;不帶進製迴圈左移

ror reg/mem,1/cl     ;不帶進製迴圈右移

2、帶進製迴圈移位指令rcl和rcr

rcl reg/mem,1/cl     ;帶進製迴圈左移

rcr reg/mem,1/cl     ;帶進製迴圈右移

迴圈移位指令按照指令功能設定進製標誌cf,不影響sf、zf、pf、af標誌。對of標誌的影響,迴圈移位指令與移位指令一樣。

移位操作指令和迴圈移位操作指令示意圖:

C語言入門(十一)位操作

位域 允許把乙個位元組拆開來使用,把乙個位元組的二進位制位劃分成不同的區域,並支援命名 使用位域的做法是在結構體定義時,在結構體成員後面使用冒號和數字來表示該成員所佔的位數 位域的寬度不能超過它所依附型別的長度 位域成員可以沒有名稱,只要給出資料型別和位寬即可 不能對位域進行取址運算 如 struc...

彙編中的操作指令

不太會搞,將就著看吧。說明 小括號裡是指令格式,後面是指令的功能,opd是目的運算元,ops是源運算元1 加法指令 add加法 add opd,ops opd opd ops adc帶進製加法 adc opd,ops opd opd ops cf inc加1 inc opd opd的內容加 opd可...

彙編(十) 算術運算類指令

算術運算類指令用來執行二進位制及十進位制的算術運算 加減乘除。這類指令會根據運算結果影響狀態標誌,有時要利用某些標誌才能得到正確的結果。一 加法指令 1 加法指令add add reg,imm reg mem reg reg imm reg mem add mem,imm reg mem mem i...