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