2016-07-07 16 views
0

ich denke, dass mein Code korrekt ausgeführt werden muss (es scheint logisch), aber in der letzten Schleife die Dekrement-Anweisung funktioniert nicht und das Programm tritt in eine Endlosschleife . hier ist mein Code:8086 Programm zur Berechnung der Multiplikation von zwei Matrizen funktioniert nicht

; multi-segment executable file template. 

data segment 
matrix1 db 1,2,3,4,5,6,7,8,9 
matrix2 db 1,2,3,4,5,6,7,8,9 
n dw 3 
row db 3 
column dw 3 
n2 db 9 
result db 100 dup(0) 
counter dw 3 


ends 

stack segment 
dw 128 dup(0) 
ends 

code segment 
start: 
; set segment registers: 
mov ax, data 
mov ds, ax 
mov es, ax 


mov bx,offset matrix1 
mov bp,offset result 


sub bx,n 
dec bx  
push bx 


new_row: 

mov di,offset matrix2 
dec di 
pop bx 
add bx,n 
inc bx 
dec bp  
mov cx,n 
mov counter,cx ;counter checks if th columns are over for a raw 


each_row: 
inc bp 
push bx 

inc di 
dec counter 
je -1,new_row 

col:  
mov ah,[bx] 
mov al,[di] 
mul ah 

add [bp],al  
inc bx 
add di,n  
dec column ;this is where the dec instruction stops working  
jnz col  
mov cx,n 
mov column,cx 
pop bx  
dec row 
jnz each_row 


mov ax, 4c00h ; exit to operating system. 
int 21h  
ends 

end start ; set entry point and stop the assembler. 
+2

Was meinst du, dass "Dec" "nicht funktioniert"? Woher weißt du, dass diese Anweisung die ist, die nicht funktioniert? Hast du deinen Code in einem Debugger durchgegangen? Was ist der Wert von 'column' nach drei Iterationen der Schleife? Mehr als wahrscheinlich, ist das Problem tatsächlich die spätere 'mov'-Anweisung, die' Spalte' modifiziert –

+2

Wenn Sie in Assembly programmieren, mit einem bekannten Assembler, ist es keine gute Idee zu denken, dass die CPU die Dinge nicht richtig macht. Das ist sehr unwahrscheinlich. Wenn die CPU nicht richtig mit DEC umgehen würde, würden viele, wenn nicht die meisten Programme, nicht korrekt funktionieren, und die Leute hätten es inzwischen herausgefunden. Wenn ein Fehler auftritt, nehmen Sie an, dass es Ihr ist und nicht die CPU. –

+0

Ich benutze 8086 Assembler und es gibt eine Option, wo Sie den Wert der Variablen sehen können und so sehe ich die Menge der Spalte bleibt gleich und die Dez-Anweisung funktioniert nicht. Ich habe gerade den Wert in die Register verschoben und jetzt funktioniert es richtig. Weiß jemand, warum es passiert ist? – cel

Antwort

1

Sie den Puffer Ergebnis im Datenteil des Programms genannt gesetzt haben.
An einem bestimmten Punkt möchten Sie auf diesen Puffer mit dem Register BP verweisen. (Sie schrieb mov bp,offset result Hierin liegt die Gefahr Alle Adressieren von Speicher [bp] verwendet das SS Segmentregister standardmäßig mit

Lösen Sie das Problem mit Ihrem Programm durch einen Segmentüberschreibung Präfix in der add [bp], al Anweisung eingefügt:.!.

col:  
mov ah,[bx] 
mov al,[di] 
mul ah 
add ds:[bp],al <<<<< See the ds: ? 

Bitte beachten Sie, dass wie ein Segmentüberschreibung Präfix zu schreiben, ist Assembler spezifische Dies sind andere Möglichkeiten.

add [ds:bp],al 

und:

ds: 
add [bp], al 

dec counter 
je -1,new_row 

Was diese eigentümliche Syntax tun soll?