匯編語言是依賴于計(jì)算機(jī)的低級(jí)的程序設(shè)計(jì)語言。
RCL(帶進(jìn)位循環(huán)左移)指令把每一位都向左移,進(jìn)位標(biāo)志位復(fù)制到 LSB,而 MSB 復(fù)制到進(jìn)位標(biāo)志位:
如果把進(jìn)位標(biāo)志位當(dāng)作操作數(shù)最高位的附加位,那么 RCL 就成了循環(huán)左移操作。下面的例子中,CLC 指令清除進(jìn)位標(biāo)志位。第一條 RCL 指令將 BL 最高位移入進(jìn)位標(biāo)志位,其他位都向左移一位。第二條 RCL 指令將進(jìn)位標(biāo)志位移入最低位,其他位都向左移一位:
clc ; CF = 0
mov bl, 88h ; CF,BL = 0 1000100Ob
rcl bl, 1 ; CF,BL = 1 00010000b
rcl b1, 1 ; CF,BL = 0 00100001b
從進(jìn)位標(biāo)志位恢復(fù)位
RCL 可以恢復(fù)之前移入進(jìn)位標(biāo)志位的位。下面的例子把 testval 的最低位移入進(jìn)位標(biāo)志位,并對(duì)其進(jìn)行檢查。如果 testval 的最低位為 1,則程序跳轉(zhuǎn);如果最低位為 0,則用 RCL 將該數(shù)恢復(fù)為初始值:
.data
testval BYTE 01101010b
.code
shr testval, 1 ; 將lsb移入進(jìn)位標(biāo)志位
jc exit ; 如果該標(biāo)志位置 1,則退出
rcl testval, 1 ; 否則恢復(fù)該數(shù)原值
RCR 指令
RCR(帶進(jìn)位循環(huán)右移)指令把每一位都向右移,進(jìn)位標(biāo)志位復(fù)制到 MSB,而 LSB 復(fù)制到進(jìn)位標(biāo)志位:
從上圖來看,RCL 指令將該整數(shù)轉(zhuǎn)化成了一個(gè) 9 位值,進(jìn)位標(biāo)志位位于 LSB 的右邊。下面的示例代碼用 STC 將進(jìn)位標(biāo)志位置 1,然后,對(duì) AH 寄存器執(zhí)行一次帶進(jìn)位循環(huán)右移操作:
stc ; CF = 1
mov ah, 10h ; AH, CF = 00010000 1
rcr ah, 1 ; AH, CF = 10001000 0
有符號(hào)數(shù)溢出
如果有符號(hào)數(shù)循環(huán)移動(dòng)一位生成的結(jié)果超過了目的操作數(shù)的有符號(hào)數(shù)范圍,則溢出標(biāo)志位置 1。換句話說,即該數(shù)的符號(hào)位取反。下例中,8 位寄存器中的正數(shù)(+127)循環(huán)左移后變?yōu)樨?fù)數(shù)(-2):
mov al, +127 ; AL = 01111111b
rol al, 1 ; OF = 1, AL = 11111110b
同樣,-128 向右移動(dòng)一位,溢出標(biāo)志位置 1。AL 中的結(jié)果(+64)符號(hào)位與原數(shù)相反:
mov al, -128 ; AL = 10000000b
shr al, 1 ; OF = 1, AL = 01000000b
如果循環(huán)移動(dòng)次數(shù)大于 1,則溢出標(biāo)志位無定義。
總結(jié)
以上所述是小編給大家介紹的匯編語言RCL(帶進(jìn)位循環(huán)左移)和RCR(帶進(jìn)位循環(huán)右移)指令,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)html5模板網(wǎng)網(wǎng)站的支持!
如果你覺得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!