0%

8086指令基础 - 位移指令

最近在学习 16位汇编编程,所以顺便将每日所学记录下来,一方面为了巩固学习的知识,另一方面也为同样在学习汇编开发的童鞋们提供一份参考。

运行环境:

  • 操作系统: Windows 10家庭版
  • 编译器:Windows XP Debug

位移指令

将操作移动一位或多位,分为逻辑移位和算术移位,分别具有左转和右转操作

逻辑位移

1
2
SHL reg/mem,1/CL
SHR reg/mem,1/CL

demo:

1
2
3
4
5
6
;左移
0B26:0100 B80200 MOV AX,0002
0B26:0103 D0E0 SHL AL,1 //左移一位
0B26:0105 B103 MOV CL,03
0B26:0107 D3E0 SHL AX,CL //如果需要左移超过1,必须存放在cl中
0B26:0109 C3 RET

左移操作:

demo:

1
2
3
4
5
6
;右移操作
0B26:0100 B80400 MOV AX,0004
0B26:0103 D1E8 SHR AX,1
0B26:0105 B102 MOV CL,02
0B26:0107 D3E8 SHR AX,CL
0B26:0109 C3 RET

右移操作:

算术移位

SAL 与 SAR 指令的操作数类型与 SHL 和 SHR 指令完全相同;

SAR算术右移高位补符号位

循环移位指令

将操作数从一段移出的位返回到另一端形成循环,分成不带进程和带进程,分别具有左移和右移操作

1
2
ROL	reg/mem			;不带进位循环左移
ROG reg/mem ;不带进位循环右移

demo:

1
2
3
4
0B26:0100 B8EEFF        MOV     AX,FFEE
0B26:0103 B104 MOV CL,04
0B26:0105 D3C0 ROL AX,CL
0B26:0107 C3 RET