使用 IDIV 时跳转到随机代码

Jumping to random code when using IDIV

我对汇编程序比较陌生,但是在创建适用于数组并计算每行平均值的代码时,我遇到了一个问题,表明我不知道除法的真正工作原理。这是我的代码:

.model tiny
.code
.startup
        Org     100h
        Jmp Short Start
N   Equ     2 ;columns
M   Equ 3 ;rows

Matrix  DW  2, 2, 3   ; elements
    DW  4, 6, 6   ; elements]
Vector  DW  M Dup (?)
S   Equ Type Matrix

Start:

    Mov Cx, M;20
    Lea Di, Vector
    Xor Si, Si

Cols:   Push    Cx
    Mov Cx, N
    Xor Bx, Bx
    Xor Ax, Ax

Rows:   
    Add Ax, Matrix[Bx][Si]
Next:
    Add Bx, S*M
    Loop    Rows
    Add Si, S   
    Mov [Di], Ax    
    Add Di, S  
        Pop     Cx
    Loop    Cols   

    Xor Bx, Bx 

    Mov Cx, M
    Mov DX, 2
Print:  Mov Ax, Vector[Bx]
    IDiv    Dx; div/idiv error here
    Add Bx, S
    Loop    Print

.exit 0

编译时没有错误。元素计数正确,但当除法发生时,调试器显示程序跳转到明显的随机代码。为什么会发生这种情况,我该如何解决?

如果使用x86架构,16位操作数的IDiv也会将Dx作为整数的一部分进行除法,如果商太大则抛出异常(中断)大到适合 16 位。

尝试这样的事情:

    Mov Di, 2
Print:  Mov Ax, Vector[Bx]
    Cwd ; sign extend Ax to Dx:Ax
    IDiv    Di