2016-07-07 9 views
0

私のコードは正しく実行されなければならないと思いますが(論理的ですが)、最後のループでは減分命令が機能せず、プログラムは無限ループに入ります。あなたはあなたのプログラムのデータセクションにバッファ命名結果を入れている8086 2つの行列の乗算を計算するプログラムが動作しない

; 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

「dec」は「動作しません」という意味はどうですか?その指導が働いていないことをどのように知っていますか?デバッガでコードをステップ実行しましたか?ループの3回の繰り返しの後に 'column'の値は何ですか?おそらく、問題は実際に 'column'を変更する後の' mov'命令です。 –

+2

よく知られているアセンブラを使ってアセンブリをプログラムすると、CPUが正しく動作しないと考えるのは良い考えではありません。それは非常にありそうもありません。 CPUがDECを適切に処理できない場合は、ほとんどのプログラムが正しく動作しない場合が多く、そうでない場合は多くの人が今までに見つけたでしょう。エラーがある場合、それはあなたのものであり、CPUのものではないと仮定します。 –

+0

私は8086アセンブラを使用していますが、変数の値を見ることができるオプションがあります。これは、カラムの量が同じであり、dec命令が機能しないことがわかります。私はちょうどレジスタに値を移動し、今は正常に動作しています。誰がなぜそれが起こったのか知っていますか? – cel

答えて

1

: はここに私のコードです。
ある時点で、BPレジスタを使用してこのバッファを参照したいとします。 (あなたはmov bp,offset resultを書いたここでは、危険をあるすべてのメモリが[bp]を使用して取り組むデフォルトでSSセグメントレジスタを使用しています

add [bp], al命令でセグメントオーバーライドプレフィックスを挿入することで、あなたのプログラムに問題を解決:。!。

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

セグメントオーバーライドプレフィックスを書く方法はアセンブラ特異的であることに注意してください これらは他の可能性ある:。

add [ds:bp],al 

と:

ds: 
add [bp], al 

dec counter 
je -1,new_row 

行うことになって、この独特の構文は何ですか?

関連する問題