彙編---移位指令

小小可發表於2020-05-06

前言

吐槽一下下,彙編的指令真的好多呀,學了這麼多可是記住的卻沒幾個,所以寫下這篇文章加深對彙編移位指令的理解和記憶

1、邏輯移位指令

邏輯移位指令適用於帶符號數運算

邏輯左移 SHL

指令格式:SHL OPR,CNT

:sparkling_heart:PR:是指被移位的運算元 ​ :sparkling_heart: CNT:是指移位次數

比如將二進位制數 1100 1111 左移 1 位,該數就變為 1001 1110,cf=1:

程式碼

MOV AL,0CFh
SHL AL,1

邏輯右移 SHR

指令格式:SHR OPR,CNT

下圖所示為二進位制數 1100 1111 邏輯右移一位,得到 0110011,最低位移入進位標誌位,cf=1:

程式碼

MOV AL,0CFH
SHR AL,1

2、算術移位指令

算術移位指令適用於無符號數運算

算數左移 SAL

指令格式:SAL OPR,CNT

:hibiscus: 算數左移和邏輯左移完全一樣噠,這裡就不多說了

算術右移 SAR

指令格式:SAR OPR,CNT

例如,二進位制數 1100 1111,符號位為 1。算術右移一位後,得到 1110 0111:

程式碼

MOV AL,0CFH
SAR AL,1

3、迴圈移位指令

迴圈左移 ROL

指令格式:ROL OPR,CNT

比如將二進位制數 1100 1111 迴圈左移 4 位,該數就變為1111 1100,cf=1:

程式碼

MOV CL,4
MOV AL,0CFH    ;AL = 11001111b
ROL AL,4       ;左移1位:10011111b, cf=1
               ;左移2: 00111111b, cf=1
               ;左移3位:01111110b, cf=0
               ;左移4位:11111100b, cf=1

迴圈右移 ROR

指令格式:ROR OPR,CNT

比如將二進位制數 1100 1111 迴圈右移 4 位,該數就變為 11111100,cf=1:

程式碼

MOV CL,4
MOV AL,0CFH    ;AL = 11001111b
ROR AL,4       ;右移1位:11100111b, cf=1
               ;右移2: 11110011b, cf=1
               ;右移3位:11111001b, cf=1
               ;右移4位:11111100b, cf=1

4、注意點

移位次數由CNT決定,它的取值為1或者CL

(1)CNT=1時,只移動一位

MOV BL,8Fh      ; BL = 10001111b
SHL BL,1        ;移位後 BL = 00011110b

(2)CNT > 1時,則在使用移位指令前,應首先將移位次數送給CL暫存器

MOV BL,8Fh      ; BL = 10001111b
MOV CL,2
SHL BL,CL       ;移位後 BL = 00111100b
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章