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.
「dec」は「動作しません」という意味はどうですか?その指導が働いていないことをどのように知っていますか?デバッガでコードをステップ実行しましたか?ループの3回の繰り返しの後に 'column'の値は何ですか?おそらく、問題は実際に 'column'を変更する後の' mov'命令です。 –
よく知られているアセンブラを使ってアセンブリをプログラムすると、CPUが正しく動作しないと考えるのは良い考えではありません。それは非常にありそうもありません。 CPUがDECを適切に処理できない場合は、ほとんどのプログラムが正しく動作しない場合が多く、そうでない場合は多くの人が今までに見つけたでしょう。エラーがある場合、それはあなたのものであり、CPUのものではないと仮定します。 –
私は8086アセンブラを使用していますが、変数の値を見ることができるオプションがあります。これは、カラムの量が同じであり、dec命令が機能しないことがわかります。私はちょうどレジスタに値を移動し、今は正常に動作しています。誰がなぜそれが起こったのか知っていますか? – cel