Thumb指令集之:Thumb數(shù)據(jù)處理指令
11.4.19邏輯左移指令LSL(2)
(1)編碼格式
邏輯左移指令LSL(2)的編碼格式如圖11.25所示。
圖11.25LSL(2)指令的編碼格式
邏輯左移指令LSL(2)可以實現(xiàn)以2為底的冪的乘法。進行移位后空出的位添0并根據(jù)指令的操作結(jié)果更新程序狀態(tài)寄存器的標志位。
(2)指令的語法格式
LSLRd>,Rs>
①Rd>
操作數(shù)寄存器,包含被移位的值并保存指令的執(zhí)行結(jié)果。
②Rs>
包含邏輯左移位數(shù)的寄存器。
(3)指令操作的偽代碼
ifRs[7:0]==0
CFlag=unaffected
Rd=unaffected
ElseifRs[7:0]32then
CFlag=Rd[32–Rs[7:0]]
Rd=Rdlogical_shift_leftRs[7:0]
ElseifRs[7:0]==32then
CFlag=Rd[0]
Rd=0
ElseifRs[7:0]==32then
CFlag=Rd[0]
Rd=0
Else/*Rs[7:0]>32*/
CFlag=0
Rd=0
NFlag=Rd[31]
ZFlag=ifRd==0then1else0
VFlag=unaffected
(4)對應(yīng)的ARM指令
MOVSRd>,Rd>,LSLRs>
11.4.20邏輯右移指令LSR(1)
(1)編碼格式
邏輯左移指令LSR(1)的編碼格式如圖11.26所示。
圖11.26LSR(1)指令的編碼格式
邏輯右移指令LSR(1)可以實現(xiàn)以2為底的冪做除數(shù)的除法。進行移位后空出的位添0,并根據(jù)指令的執(zhí)行結(jié)果更新程序狀態(tài)寄存器的標志位。
(2)指令的語法格式
LSRRd>,Rm>,#immed_5>
①Rd>
目的寄存器。存儲指令的操作結(jié)果。
②Rm>
操作數(shù)寄存器。該寄存器保存的數(shù)據(jù)將進行右移操作。
③immed_5>
邏輯右移位數(shù),范圍為0~31。
(3)指令操作的偽代碼
ifimmed_5==0
CFlag=Rd[31]
Rd=0
Else/*immed_5>0*/
CFlag=Rd[immed_5-1]
Rd=RmLogial_shift_rightimmed_5
NFlag=Rd[31]
ZFlag=ifRd==0then1else0
VFlag=unaffected
(4)對應(yīng)的ARM指令
MOVSRd>,Rm>,LSR#immed_5>
11.4.21邏輯右移指令LSR(2)
(1)編碼格式
邏輯左移指令LSR(2)的編碼格式如圖11.27所示。
圖11.27LSR(2)指令的編碼格式
邏輯右移指令LSR(2)可以實現(xiàn)以2為底的冪做除數(shù)的無符號除法。進行移位后空出的位添0,并根據(jù)指令的操作結(jié)果更新程序狀態(tài)寄存器的標志位。
(2)指令的語法格式
LSRRd>,Rs>
①Rd>
操作數(shù)寄存器,包含被移位的值并保存指令的執(zhí)行結(jié)果。
②Rs>
包含邏輯右移位數(shù)的寄存器。
(3)指令操作的偽代碼
ifRs[7:0]==0
CFlag=unaffected
Rd=unaffected
ElseifRs[7:0]32then
CFlag=Rd[Rs[7:0]-1]
Rd=Rdlogical_shift_RightRs[7:0]
ElseifRs[7:0]==32then
CFlag=Rd[31]
Rd=0
ElseifRs[7:0]==32then
CFlag=Rd[0]
Rd=0
Else/*Rs[7:0]>32*/
CFlag=0
Rd=0
NFlag=Rd[31]
ZFlag=ifRd==0then1else0
VFlag=unaffected
(4)對應(yīng)的ARM指令
MOVSRd>,Rd>,LSRRs>
評論