Shift和Rotate操作不适用于8086培训师套件,为什么?

时间:2019-04-03 16:18:04

标签: assembly x86-16 emu8086

我一直在 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而不是移位操作,因为在大型程序中使用时会变得非常复杂。

3 个答案:

答案 0 :(得分:1)

  

它将被卡在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可能会更快,因为每个移位的计数都需要一个额外的周期。)

答案 1 :(得分:0)

对于问题的第二部分,一旦您将其组装起来并在期望16 >> 2 = 5时得到了4

这是因为您的汇编器会将所有数字都视为十六进制(以16为底)。

如果您使用16十六进制,即二进制0001 0110,那么您将移位2次就会得到
0000 0101等于5,
 0 = 81= 40=21=1

0x16 >> 2 = 5

所以您需要指定16个基本十进制
或以十六进制为基础

0x16 =22。如果想要十进制数16,则以十六进制10表示。

答案 2 :(得分:0)

完成MOV AX,16之类的操作后,该值在内部表示为0000 0000 0001 0110。因此AX寄存器的内容现在为0000 0000 0001 0110

因此,当完成移位操作SHR AX,CL时,CL为2时,AX中的值将变为0000 0000 0000 0101,即5

这就是为什么

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

在移位操作后已给5