汇编除以零

Assembly Divide by zero

我正在尝试为一个程序编写代码来计算数组的平均值,但我得到了被零除的错误,我用谷歌搜索了这个错误,它似乎是一个除法溢出,但我不明白是什么我应该在我的程序中做什么才能工作。这是我的代码:

`DATA SEGMENT
msg1 db 0dh,0ah,"Please enter the length of the array: $"
msg2 db 0ah,0ah,"Enter number: $"
msg3 db 0dh,0ah,"Array average is: $"
val db ?

DATA ENDS

CODE SEGMENT
ASSUME CS:CODE, DS:DATA

START:
mov ax,data
mov ds,ax

mov dx,offset msg1
mov ah,09h
int 21h

mov ah,01h
int 21h
sub al,30h

mov bl,al
mov cl,al
MOV AL,00
MOV VAL,AL
lbl1:
mov dx,offset msg2
mov ah,09h
int 21h

mov ah,01h
int 21h
sub al,30h

add al, val
mov val,al
loop lbl1

lbl2:
mov dx,offset msg3
mov ah,09h
int 21h

mov al, val

div bl
add ax,3030h
mov dx,ax
mov ah,02h
int 21h

mov ah,4ch
int 21h

Code ends
end Start
CODE ENDS`

div blax 除以 bl 并将商存储在 al 中,将余数存储在 ah 中。商必须在 0x00..0xFF 范围内,否则会发生除法溢出。

你在除法之前设置的最后一个 ah 是 9。由于 ahax 的最重要部分,这意味着 ax 将具有值进行除法时为 0x9XY(其中 XY 是任何十六进制数字)。因此,要获得 <=0xFF 的商,您必须至少除以 10。

解决办法是在除法前清零ah(xor ah,ahmov ah,0)。