Shift 和 Rotate 操作在 8086 训练器套件上不起作用,为什么?
Shift and Rotate operations not working on 8086 trainer kit, why?
我一直在对 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 代替移位运算,因为在大型程序中使用它会变得非常复杂。
对于你问题的第二部分,当你达到 assemble 并得到 16 >> 2 = 5
而你期望 4
:
那是因为 您的 assembler 将所有数字都视为 HEX(基数 16)。
如果你有 16
十六进制,那就是二进制 0001 0110
,那么你移动 2 次就会得到
0000 0101
即 5,
0 = 8
、1= 4
、0=2
、1=1
0x16 >> 2 = 5
因此您需要指定 16 进制小数
或使用十六进制
0x16 = 22。如果你想要十进制的 16,那就是十六进制的 10
。
当像 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
。
it will be stuck at the line SHR AX,2
like if there was some syntax error. similar is the case with other shift & rotate operations.
如 NASM 的指令参考中所列,具有立即移位计数操作数的 SHR 是 186+ 指令。由于您似乎正在使用 emu8086,因此您的汇编器和目标机器不支持它。
参考https://ulukai.org/ecm/insref.htm#insSHL
8086 只有 machine-code 个操作码,用于 cl
的移位和隐式 1
的移位。编写 shr ax,1
汇编成一条没有立即数的指令,只是用于按 1
.
的隐式计数移位的操作码
不支持其他计数,因为在 186 之前没有可用的编码。
您可以使用 shr
两次移动 2,或者使用 mov cl, 7
/ shr ax, cl
进行更大的计数。 (对于像 8 这样的大计数,在真正的 8086 上 mov al, ah
/ mov ah,0
可能更快,其中每次轮班计数都需要一个额外的周期。)
我一直在对 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 代替移位运算,因为在大型程序中使用它会变得非常复杂。
对于你问题的第二部分,当你达到 assemble 并得到 16 >> 2 = 5
而你期望 4
:
那是因为 您的 assembler 将所有数字都视为 HEX(基数 16)。
如果你有 16
十六进制,那就是二进制 0001 0110
,那么你移动 2 次就会得到
0000 0101
即 5,
0 = 8
、1= 4
、0=2
、1=1
0x16 >> 2 = 5
因此您需要指定 16 进制小数
或使用十六进制
0x16 = 22。如果你想要十进制的 16,那就是十六进制的 10
。
当像 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
。
it will be stuck at the line
SHR AX,2
like if there was some syntax error. similar is the case with other shift & rotate operations.
如 NASM 的指令参考中所列,具有立即移位计数操作数的 SHR 是 186+ 指令。由于您似乎正在使用 emu8086,因此您的汇编器和目标机器不支持它。
参考https://ulukai.org/ecm/insref.htm#insSHL
8086 只有 machine-code 个操作码,用于 cl
的移位和隐式 1
的移位。编写 shr ax,1
汇编成一条没有立即数的指令,只是用于按 1
.
不支持其他计数,因为在 186 之前没有可用的编码。
您可以使用 shr
两次移动 2,或者使用 mov cl, 7
/ shr ax, cl
进行更大的计数。 (对于像 8 这样的大计数,在真正的 8086 上 mov al, ah
/ mov ah,0
可能更快,其中每次轮班计数都需要一个额外的周期。)