使用IDIV时跳转到随机代码

时间:2015-12-15 20:05:32

标签: debugging assembly x86 division x86-16

我对汇编程序比较新,但是在创建与数组一致的代码并计算每行的平均值时,我遇到了一个问题,表明我不知道除法是如何工作的。这是我的代码:

.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

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

1 个答案:

答案 0 :(得分:1)

如果使用x86体系结构,带有16位操作数的IDiv也将Dx作为要分割的整数的一部分,如果商太大而无法引发异常(中断)适合16位。

尝试这样的事情:

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