装配中的换档问题

Shifting Division issue in assembly

使用 shr 但仅在我使用 shift 计数 1 时才工作,因为它不工作。 . . .只有除以 2 是可行的,但当超过时,事情就不顺利了。 这是例如代码:

.model small
.stack 100h
.data
num db 8
.code
main proc
mov ax , @data
mov ds , ax

mov al , num
shr al , 2 ; this instruction is giving the error   
mov dl ,al 
add dl , 48
mov ah ,2
int 21h

mov ax , 4c00h
int 21h

main endp
end main

一些汇编程序接受:

shr ax, 4

其他汇编器需要使用 CL :

mov  cl, 4
shr  ax, cl

同时测试 SHR 是否需要 8 位或 16 位寄存器:

shr  al, cl          ;<==== THIS MIGHT BE REJECTED.
shr  ax, cl

这取决于您使用的汇编器。接下来的两个链接帮助:

http://www.masmforum.com/board/index.php?PHPSESSID=8d46cd4ecb1688be429ab49694ec53e6&topic=12565.0;wap2

http://people.sju.edu/~ggrevera/arch/references/MASM61PROGUIDE.pdf

在8086上,SHR指令可以shr al,1右移一位,也可以shr al,cl右移多位。所以如果你想右移两个地方,你要么写两个移位指令:

shr al,1
shr al,1

或者您将值 2 放入 cl 并移位:

mov cl,2
shr al,cl

后来的 Intel 处理器(我不记得是 80286 还是 80386)添加了 shr al,x,其中 x 可以是 1 以外的数字。

如果您在编译时遇到该错误(即汇编程序发出错误),则表明该指令对于您选择为其生成代码的处理器无效。

如果您在运行时收到非法指令,那是因为汇编程序为后来的处理器(例如 80386)生成代码,但您 运行 8086 上的代码,不支持该指令。