我对汇编程序比较新,但是在创建与数组一致的代码并计算每行的平均值时,我遇到了一个问题,表明我不知道除法是如何工作的。这是我的代码:
.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
编译时没有错误。元素被正确计算,但是当分割发生时,调试器显示程序跳转到明显随机的代码。为什么会发生这种情况?如何解决?
答案 0 :(得分:1)
如果使用x86体系结构,带有16位操作数的IDiv
也将Dx
作为要分割的整数的一部分,如果商太大而无法引发异常(中断)适合16位。
尝试这样的事情:
Mov Di, 2
Print: Mov Ax, Vector[Bx]
Cwd ; sign extend Ax to Dx:Ax
IDiv Di