2016-04-20 19 views
0

Ich mache diese Übung für die Universität und meine Assembler gibt mir einen Überlauf während einer Abteilung, ich habe Schritt für Schritt Debug-Register überprüft, aber ich kann das Problem nicht lösen, weil ich nicht in der Lage bin, es zu finden . Ich poste den Code, damit Sie versuchen könnten, mir zu helfen. Das Ziel des Programms ist es, die Anzahl der Münzen für den jeweiligen Wert zu multiplizieren, zum Beispiel habe ich 10 Münzen von 1 Euro, also habe ich 10 Euro; Ich muss mir merken, wie viel Geld ich insgesamt habe; Münzen und Werte sind in zwei Vektoren und sie sind jeweils durch Position verbunden.Division Überlauf auf Assembly

Der Code ist für einen Intel 8086

.model small 
.stack 
.data 
value dw 1,2,5,10,20,50,100,200 
coins db 100,23,17,0,79,48,170,211 
euro dw 0 
cent dw 0 
.code 
.startup 
mov si,0 ;must arrive on 8 
mov di,0 
mov bx,100 ;to separate euro and decimals 
mon: mov al,coins[si] 
cbw 
mul value[di] 
div bx 
add cent,dx 
add euro,ax 
inc si 
inc di 
inc di 
cmp cent,100 
jb cicl 
mov ax,cent 
mov cent,0 
mov dx,0 
div bx 
add euro,ax 
mov cent,dx 
cicl: cmp si,8 
jnz mon 
.exit 
end 

Hoffe mein Code ist klar. Vielen Dank und Entschuldigung für mein schlechtes Englisch.

+0

'Intel® 64 und IA-32 Architektur Software Entwicklerhandbuch Band 2 (2A, 2B & 2C): Befehlssatz Referenz, AZ', Abschnitt von 'div': * Vorzeichenlose Teilung DX: AX von r/m16, mit Ergebnis gespeichert in AX ← Quotient, DX ← Rest. * Wo hast du 'DX' auf einen vernünftigen Wert gesetzt? – EOF

+0

@EOF 'mul' did;) – Jester

+1

Das geht davon aus, dass der Assembler 'mul-Wert [di]' als' mul r/m16 'behandelt – Michael

Antwort

1

Ich glaube cbw den falschen Wert zu AH-Register geben, so wollen wir es durch mov ah,0 ändern, hier ist der Code (ich bin immer das Ergebnis 634,11, ist das richtig?):

.model small 
.stack 
.data 
value dw 1,2,5,10,20,50,100,200 
coins db 100,23,17,0,79,48,170,211 
euro dw 0 
cent dw 0 
.code 
.startup 
mov si,0 ;must arrive on 8 
mov di,0 
mov bx,100 ;to separate euro and decimals 
mon: mov al,coins[si] 
mov ah,0     ;<========================================= cbw 
mul value[di] 
div bx 
add cent,dx 
add euro,ax 
inc si 
inc di 
inc di 
cmp cent,100 
jb cicl 
mov ax,cent 
mov cent,0 
mov dx,0 
div bx 
add euro,ax 
mov cent,dx 
cicl: cmp si,8 
jnz mon 
.exit 
end 
1
mon: 
mov al,coins[si] 
cbw 

Sie haben 2 Münzen Werte (170 und 211), die Fehler, wenn Sie die cbw Anweisung, um den Wert zu verlängern. Bessere Verwendung mov ah,0. Als Alternative könnten Sie das Münzen-Array als Wort definieren und dann einfach mov ax,coins[si] schreiben. Dies würde natürlich erfordern, dass Sie das SI-Register inc verdoppeln und SI anstelle von 8 für die Schleifensteuerung mit 16 vergleichen.


cmp cent,100 
jb cicl 
mov ax,cent  !? 
mov cent,0  !? 
mov dx,0   !? 
div bx   !? 
add euro,ax  !? 
mov cent,dx  !? 
cicl: 

Was Sie hier tun, ist viel zu komplex! Die Anweisung div bx (mit BX = 100) hat einen Rest von max. 99 im DX-Register und so wissen Sie, dass auf jede Iteration des cent Variable kann höchstens um 99. Mit dieser Tatsache und vereinfacht den Code erhöht werden:

cmp cent,100 
jb cicl 
sub cent,100 
inc euro 
cicl: