位操作類指令對(duì)二進(jìn)制的各個(gè)位進(jìn)行操作,包括邏輯運(yùn)算指令和移位指令。 一、邏輯運(yùn)算指令 邏輯運(yùn)算指令用來(lái)對(duì)字或字節(jié)按位進(jìn)行邏輯運(yùn)算,包括邏輯與AND、邏輯或OR、邏輯非NOT、邏輯異或XOR和測(cè)試TEST五條指令。 1、邏輯與指令A(yù)ND AND dest,src ;des←dest∧src(符號(hào)∧表示邏輯與) AND指令對(duì)兩個(gè)操作數(shù)執(zhí)行按位的邏輯與運(yùn)算:即只有相“與”的兩位都是1,結(jié)果才是1;否則,“與”的結(jié)果為0。邏輯與的結(jié)果送到目的操作數(shù)。用AND指令可以將一個(gè)字節(jié)或字中的某些特定位清零,或者說(shuō)將某些位截取下來(lái)。如將ASCII碼的高4位清零,亦即截取低4位,假設(shè)這個(gè)ASCII碼已在AL中,則AND AL,00001111B就會(huì)將AL中的低4位截取下來(lái),將AL中的高4位清零。其中00001111B稱為邏輯乘常數(shù)。AND指令及后面介紹的其他雙操作數(shù)邏輯指令OR、XOR和TEST,源操作數(shù)可以是任意尋址方式,而目的操作數(shù)只能是立即數(shù)之外的其他尋址方式,并且兩個(gè)操作數(shù)不能同時(shí)為存儲(chǔ)器尋址方式。所有雙操作數(shù)的邏輯指令均設(shè)置CF=OF=0,根據(jù)結(jié)果設(shè)置SF、ZF和PF狀態(tài),而對(duì)AF未定義。 2、測(cè)試指令TEST TEST dest,src ;dest∧src(符號(hào)∧表示邏輯與) TEST指令對(duì)兩個(gè)操作數(shù)執(zhí)行按位的邏輯與運(yùn)算,但結(jié)果不回送目的操作數(shù)。TEST指令執(zhí)行的操作與AND相同,但不保存執(zhí)行結(jié)果,只根據(jù)結(jié)果來(lái)設(shè)置狀態(tài)標(biāo)志。TEST指令通常用于檢測(cè)一些條件是否滿足,但又不希望改變?cè)床僮鲾?shù)的情況,這條指令之后,一般都是條件轉(zhuǎn)移指令,目的是利用測(cè)試條件轉(zhuǎn)向不同的程序段。 3、邏輯或指令OR OR dest,src OR指令對(duì)兩個(gè)操作數(shù)執(zhí)行按位的邏輯或運(yùn)算:即只要相“或”的兩位有一位是1,結(jié)果就是1。OR指令可用于置位某些位。 4、邏輯異或指令XOR XOR dest,src 相異或的兩位不相同時(shí),結(jié)果就是1,否則,異或的結(jié)果為0。XOR可用于求反某些位,要求求反的位同“1”異或,維持不變的位同“0”異或。XOR指令經(jīng)常給寄存器清0,同時(shí)使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指令對(duì)操作數(shù)按位求反,NOT指令是一個(gè)單操作數(shù)指令,操作數(shù)可以是立即數(shù)以外的任何尋址方式。NOT指令不影響標(biāo)志位。 二、移位指令 1、邏輯移位指令SHL和SHR SHL reg/mem,1/CL ;邏輯左移:reg/mem左移1/CL位,最低位補(bǔ)0,最高位進(jìn)入CF SHR reg/mem,1/CL ;邏輯右移:reg/mem右移1/CL位,最高位補(bǔ)0,最低位進(jìn)入CF 2、算術(shù)移位指令SAL和SAR SAL reg/mem,1/CL ;算術(shù)左移,功能與SHL相同 SAR reg/mem,1/CL ;算術(shù)右移:reg/mem右移1/CL位,最高位不變,最低位進(jìn)入CF 移位指令按照移入的位設(shè)置進(jìn)位標(biāo)志CF,根據(jù)移位后的結(jié)果影響SF、ZF、PF,對(duì)AF沒(méi)有定義。如果進(jìn)行一位移動(dòng),則按照操作數(shù)的最高符號(hào)位是否改變,相應(yīng)設(shè)置溢出標(biāo)志OF:如果移位前的操作數(shù)最高位與移位后操作數(shù)的最高位不同(有變化),則OF=1;否則OF=0。當(dāng)移位次數(shù)大于1時(shí),OF不確定。 邏輯左移指令SHL執(zhí)行一次移位,相當(dāng)于無(wú)符號(hào)數(shù)的乘2;邏輯右移指令SHR執(zhí)行一位移位,相當(dāng)于無(wú)符號(hào)數(shù)除以2,商在目的操作數(shù)中,余數(shù)由CF標(biāo)志反映。算術(shù)右移指令SAR執(zhí)行一次移位,相當(dāng)于有符號(hào)數(shù)除以2。但應(yīng)注意,當(dāng)操作數(shù)為負(fù)(最高位為1),并且最低位有1移出時(shí),SAR指令產(chǎn)生的結(jié)果與IDIV指令的結(jié)果不同。 三、循環(huán)移位指令 循環(huán)移位指令類似移位指令,但要從一端移出的位返回到另一端形成循環(huán)。分成不帶進(jìn)位標(biāo)志循環(huán)和帶進(jìn)位標(biāo)志循環(huán)。 1、不帶進(jìn)位標(biāo)志循環(huán)指令ROL和ROR ROL reg/mem,1/CL ;不帶進(jìn)位循環(huán)左移 ROR reg/mem,1/CL ;不帶進(jìn)位循環(huán)右移 2、帶進(jìn)位循環(huán)移位指令RCL和RCR RCL reg/mem,1/CL ;帶進(jìn)位循環(huán)左移 RCR reg/mem,1/CL ;帶進(jìn)位循環(huán)右移 循環(huán)移位指令按照指令功能設(shè)置進(jìn)位標(biāo)志CF,不影響SF、ZF、PF、AF標(biāo)志。對(duì)OF標(biāo)志的影響,循環(huán)移位指令與移位指令一樣。
移位操作指令和循環(huán)移位操作指令示意圖: ·SHL 邏輯左移指令 格式:SHL OPR, CNT 其中OPR可以是除立即數(shù)以外的任何尋址方式。移位次數(shù)由CNT決定,CNT可以是1或CL。CNT為1時(shí)只移一位,如需要移位的次數(shù)大于1,則可以在該移位指令前把移位次數(shù)置于CL寄存器中,而移位指令中的CNT寫為CL即可。有關(guān)OPR及CNT的規(guī)定適用于以下的移位指令。
·SAL 算術(shù)左移指令 格式:SAL OPR,CNT 執(zhí)行的操作:與SHL相同。
·SHR 邏輯右移指令 格式:SHR OPR,CNT ·SAR 算術(shù)右移指令 格式:SAR OPR,CNT
這里最高有效位右移,同時(shí)再用它自身的值填入,即如原來(lái)是0則仍為0,原來(lái)是1則仍是為1。
·ROL 循環(huán)左移指令 格式:ROL OPR,CNT ·ROR 循環(huán)右移指令 格式:ROR OPR,CNT
·RCL 帶進(jìn)位循環(huán)左移指令 格式:RCL OPR,CNT
·RCR 帶進(jìn)位循環(huán)右移指令 格式:RCR OPR,CNT 所有移位指令都可以作字或字節(jié)操作。它們對(duì)條件碼的影響是:CF位根據(jù)各條指令的規(guī)定設(shè)置。OF位只有當(dāng)CNT=1時(shí)才是有效的,在移位后最高有效位的值發(fā)生變化時(shí)(原來(lái)為0,移位后為1,或原來(lái)為1,移位后為0)OF位置1,否則置0。循環(huán)移位指令不影響除CF和OF以外的其他條件標(biāo)志。而移位指令則根據(jù)移位后的結(jié)果設(shè)置SF、ZF和PF位,AF位則無(wú)定義??梢钥闯觯@八種指令可以分為兩組:前四種為移位指令,后四種為循環(huán)移位指令。循環(huán)移位指令可以改變操作數(shù)中所有位的位置,在程序中還是很有用的。移位指令則常常用來(lái)做乘以2或除以2的操作。其中算術(shù)移位指令適用于帶符號(hào)數(shù)運(yùn)算,SAL用來(lái)乘2,SAR用來(lái)除以2,而邏輯移位指令則用于無(wú)符號(hào)數(shù)運(yùn)算,SHL用來(lái)乘2,SHR用來(lái)除以2。
|