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
閱讀更多 又將如何存在 的文章