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