StackUnderflow
StackUnderflow

Reputation: 37

Jumping to random code when using IDIV

I am relatively new to assembler, but when creating code what works with arrays and calculates the average of each row, I encountered a problem that suggests I don't know how division really works. This is my code:

.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

There are no errors when compiling. Elements are counted correctly, but when division happens the debugger shows the program jumping to apparently random code. Why is this happening and how can I resolve it?

Upvotes: 1

Views: 74

Answers (1)

MikeCAT
MikeCAT

Reputation: 75062

If you use x86 architecture, IDiv with 16-bit operand will also take Dx as a part of the integer to be divided and throw an exception (interrupt) if the quotient is too large to fit in 16bits.

Try something like this:

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

Upvotes: 1

Related Questions