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