2016-08-05 14 views
0

Ich versuche, Code für ein Programm zu schreiben, um den Durchschnitt eines Arrays zu berechnen, aber ich bekomme die Division durch Null Fehler, ich googelte den Fehler und es scheint, dass es ein Divisionsüberlauf ist, aber ich tat es nicht verstehe, was ich in meinem Programm tun soll. Hier ist mein Code:Assembly Divide von Null

`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` 

Antwort

1

div bl teilt ax von bl und speichert den Quotienten in al, und der Rest in ah. Der Quotient muss im Bereich 0x00..0xFF liegen oder Sie erhalten einen Divisionsüberlauf.

Das letzte, was Sie ah zu setzen, bevor die Division ist 9. Da ah ist der bedeutendste Teil ax das bedeutet ax den Wert 0x9XY haben (wobei XY irgendwelche hexadezimalen Ziffern), wenn Sie die Teilung zu tun. So einen Quotienten zu erhalten, die < ist = 0xFF würden Sie von mindestens 10.

Die Lösung teilen müssen, ist ah vor der Teilung zu löschen (xor ah,ah oder mov ah,0).

+0

Ich habe versucht, aber immer noch keinen Erfolg. So was? mov al, val xor ah, ah div bx – user3848412

+0

@ user3848412 Jetzt machst du 'div bx' anstelle von' div bl'. Bist du sicher, dass du das willst? – fuz

+1

In Ihrer Frage verwenden Sie 'div bl', nicht' div bx'. Die Antwort hängt von der genauen Variante von "div" ab, die verwendet wird. – Michael