移位和旋转操作在 8086 训练器套件上不起作用,为什么



我一直在 8086 训练器套件上进行一些编码。由于某种原因,SHR,SHL,SAL,SAR,ROL,ROR操作无法对其进行处理。如果我写一个这样的声明

MOV AX,16
SHR AX,2

它将卡在行SHR AX,2就像有一些语法错误一样。 其他移位和旋转操作也是如此。

我能够使其工作的唯一方法是使用 CL 寄存器。

当我将代码更改为

MOV AX,16
MOV CL,2
SHR AX,CL

它执行了,但是AX处的值应该是4而不是5

也适用于此代码

  MOV AX,32
  MOV CL,2
  SHR AX,CL

AX 中的值是12,但它应该是8的。

这是怎么回事?我做错了什么吗?

注意:请不要告诉我使用 DIV & MUL 而不是移位操作,因为它在大型程序中使用时会变得非常复杂。

对于您问题的第二部分,一旦您将其组装起来并在您期待416 >> 2 = 5

这是因为您的汇编程序将所有数字视为十六进制(以 16 为基数(。

如果你有16十六进制,那就是二进制0001 0110,那么你移位 2 次会得到
0000 0101,那就是 5,
0 = 81= 40=21=1

0x16 >> 2 = 5

所以你需要指定 16 个基数十进制
或使用十六进制基数

0x16 = 22。 如果你想要十进制 16,那就是十六进制10

它将卡在行SHR AX,2就像存在一些语法错误一样。 其他移位和旋转操作也是如此。

如 NASM 的指令参考中所列,具有即时移位计数操作数的 SHR 是 186+ 指令。由于您似乎使用的是 emu8086,因此您的汇编程序和目标计算机不支持它。

请参阅 https://ulukai.org/ecm/insref.htm#insSHL

8086 只有机器代码操作码,用于按cl移位和按隐式1移位。 编写shr ax,1组装到一个指令,没有立即,只有用于按隐式计数 1 移动的操作码。

不支持其他计数,因为在 186 之前没有可用的编码。

您可以使用两次shr移动 2,也可以按 mov cl, 7/shr ax, cl 进行更大的计数。 (对于像 8 这样的大计数,在真正的 8086 上mov al, ah/mov ah,0可能会更快,其中班次的每个计数都需要一个额外的周期。

当像MOV AX,16这样的操作完成时,该值在内部表示为0000 0000 0001 0110。 所以AX寄存器的内容现在0000 0000 0001 0110

因此,当完成移位操作SHR AX,CL时,其中CL为 2,则 AX 中的值将变为0000 0000 0000 01015

这就是为什么

MOV AX,16 MOV CL,2 SHR AX,CL

在轮班操作后给出了5

最新更新