32位微處理器指令系統之移位指令

8086/8088指令集中的移位指令包括:

算術移位指令(SAL/SAR):

1.算術左移指令

指令格式:SAL OPD,1或SAL OPD,CL,這是原16位機就具有的算術左移指令。

32位機新增的算術左移指令是SAL OPD,imm。

2.算術右移指令

指令格式:SAR OPD,1或SAR OPD,CL或 SAR OPD,imm。

邏輯移位指令(SHL/SHR):

1.邏輯左移指令

指令格式:SHL OPD,1或SHL OPD,CL或SHL OPD,imm。

32位機新增的邏輯左移指令。

指令格式:SHLD OPD,OPS,imm或SHLD OPD,OPS,CL。

例:用32位指令編寫程序時,不能使用完整段格式編寫程序,這是因為完整段不可以使用32位寄存器,在簡化段格式下,能夠在程序的開端作出使用32位寄存器的說明後,於是就可以使用32位寄存器編程。本例中使用32位機指令將bx值移入ax中。

 .model small ; 定義為小模式,數據段、堆棧段及附加數據段在同一個段內,最大為64KB ; 代碼段是64KB;共計最大長度128KB。
.386 ; 定義本程序可以使用386指令編程
.stack
.code
.startup ; 建立段寄存器的值
mov ax,1234h
mov bx,5678h
shld ax,bx,16 ;32位cpu的指令
.exit ;退回到調用該程序執行之前的狀態
end

2.邏輯右移指令:

指令格式:SHR OPD,1或SHR OPD,CL或SHR OPD,imm。

32位機新增邏輯右移指令。

指令格式: SHRD OPD,OPS,imm 或SHRD OPD,OPS,CL。

例:利用移位及堆棧指令使AX與BX的值交換,程序如下:

.model small
.386
.code
.startup
mov ax,1234h ax=1234h
mov bx,5678h bx=5678h
push ax
shrd ax,bx,16 ; bx移入ax中 ax=5678h
pop bx ; 堆棧中存放的ax值1234H被彈出給bx
.exit
end

循環移位指令(ROL、ROR、RCL、RCR):

1.不帶進位的循環左移指令

指令格式:ROL OPD,1或ROL OPD,CL或ROL OPD,imm。

2.不帶進位的循環右移指令

指令格式:ROR OPD,1或ROR OPD,CL或ROR OPD,imm。

3.帶進位的循環左移指令

指令格式:RCL OPD,1或RCL OPD,CL或RCL OPD,imm。

4.帶進位的循環右移指令

指令格式:RCR OPD,1或RCR OPD,CL或RCR OPD,imm。

例:利用循環移位指令將AX中的內容移動到DX中,

即實現MOV DX,AX。

code segment 'code'
assume cs:code
start: mov ax,1234h
mov cx,16
cycle: ror ax,1
rcr dx,1

dec cx
jnz cycle
mov ah,4ch
;調用中斷21h的4ch號功能。
;中斷21h是DOS系統的系統調用中斷,使用ah來選擇功能。
;4ch號功能是退出程序的意思。
int 21h
code ends
end start


分享到:


相關文章: