Assembly 来自DIV组件的错误答案

Assembly 来自DIV组件的错误答案,assembly,x86,Assembly,X86,我有一部分代码 mov di,3 mov cx,16 looop: xor dx,dx shl bx,1 adc dx,dx cmp cx,16 je cx16 (it's will dec cx and jump loop) push dx dec cx cmp cx,0 je cx0 mov ax,cx div di cm

我有一部分代码

mov di,3                                                           
mov cx,16
  looop:
  xor dx,dx
  shl bx,1
  adc dx,dx
  cmp cx,16
  je cx16 (it's will dec cx and jump loop)

  push dx
  dec cx
  cmp cx,0
  je  cx0
  mov ax,cx
  div di

cmp dx,0
jne looop
当cx=3时
我将得到ax=3
但是
div di

ax将变为H=55 L=56
dx=1

你能告诉我我做错了什么吗?

div di
将32位的数量
dx:ax
除以
di
。我们不知道您的
bx
的值是多少,但它可能会产生
dx=1
(由于
adc-dx,dx
)。所以除法将是
0x10003/3=0x5556
余数
1
,这正是您看到的


PS:学习使用调试器,并根据需要阅读指令集参考。

当我运行您的程序时,在
div di
之后,我得到
al=5,ah=0,dx=0
。我用的是EMU8086。在'div di'之前,ax=15(因为cx是16,但是
dec x
),
di=3
dx=0
,所以,15/3=5。所以答案取决于机器?我忘了je cx16将dec cx取决于你想做什么,你可能需要在
div
之前将dx归零。你能给我推荐一本关于汇编的书吗