汇编除以零
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 bl
用 ax
除以 bl
并将商存储在 al
中,将余数存储在 ah
中。商必须在 0x00..0xFF 范围内,否则会发生除法溢出。
你在除法之前设置的最后一个 ah
是 9。由于 ah
是 ax
的最重要部分,这意味着 ax
将具有值进行除法时为 0x9XY(其中 XY 是任何十六进制数字)。因此,要获得 <=0xFF 的商,您必须至少除以 10。
解决办法是在除法前清零ah
(xor ah,ah
或mov ah,0
)。
我正在尝试为一个程序编写代码来计算数组的平均值,但我得到了被零除的错误,我用谷歌搜索了这个错误,它似乎是一个除法溢出,但我不明白是什么我应该在我的程序中做什么才能工作。这是我的代码:
`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 bl
用 ax
除以 bl
并将商存储在 al
中,将余数存储在 ah
中。商必须在 0x00..0xFF 范围内,否则会发生除法溢出。
你在除法之前设置的最后一个 ah
是 9。由于 ah
是 ax
的最重要部分,这意味着 ax
将具有值进行除法时为 0x9XY(其中 XY 是任何十六进制数字)。因此,要获得 <=0xFF 的商,您必须至少除以 10。
解决办法是在除法前清零ah
(xor ah,ah
或mov ah,0
)。