2011-12-24 15 views
0

アセンブリ8086でコードを作成しました。行列(配列)を次元3x3のメモリにロードします。このコードは行列3x3のこの次元に対してのみ機能します。誰かが私に次元m x nを使ってどのように働かせるか考えてくれますか?配列はメモリにロードされ、最後に別の配列の結果が出力されます。 (あなたが環境に到達するまで、左側の列の右下のレンジダウン、右の列まで、左上のシリーズなど)を時計回りと反対方向にスパイラルを印刷するメモリに与えられたおかげアセンブリの行列mxnの次元

; multi-segment executable file template. 

data segment 
matrix db 1, 2, 3, 4, 5, 6, 7, 8, 9 ; load matrix in memory 

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, matrix ; move matrix to offset bx 
mov ch, 3 
mov cl, 0 


COLUMNAHEAD: 

mov dl, [bx] ; get the first element of matrix in dl 
add dl, 30h ; add to show number 
mov ah, 02h 
int 21h ; print first number 
inc cl 

cmp cl, ch ; compare if the counter is at the end of column 


jge ROWAHEAD ; if greater go to row 
add bx, 3 ; if not inc offset for 3 
jmp COLUMNAHEAD 





ROWAHEAD: 
inc cl ; 1 element of roe 
inc bx ; inc offset for one place 
mov dl, [bx] ; get the number in dl 
add dl, 30h ; convert to number 
mov ah, 02h 
int 21h ; print the number 

cmp cl, 5 
je COLUMNAHEAD 
jne ROWAHEAD 


COLUMNBACK: 
inc cl 
sub bx, 3 
mov dl, [bx] 
add dl, 30h 
mov ah, 02h 
int 21h 
cmp cl, 7 
jne COLUMNBACK 
je ROWBACK 

ROWBACK: 
dec bx 
mov dl, [bx] 
add dl, 30h 
mov ah, 02h 
int 21h 
JMP MIDDLE 


MIDDLE: 
add bx, 3 
mov dl, [bx] 
add dl, 30h 
mov ah, 02h 
int 21h 

JMP END 

END: 


this is the code i wrote. it works for the matrix 
1, 2, 3, 
4, 5, 6, 
7, 8, 9 and print 1, 4, 7, 8, 9, 6, 3, 2, 5 

はマトリックス。これは次元3x3の場合のみ有効です。これはmxnディメンションで有効です。しかし、私はどのように、任意の提案を知らない?

+0

このうちどの部分に問題がありますか? –

+0

私は行列3x3を解く方法を知っていますが、行列m =行とn =列で動作するコードを書く必要があります。上記の書き込みは行列3x3に対してのみ機能します。 – buuuuu

+0

はいそれの一部は問題ですか?すでにあなたは組立をマスターしたようです。 –

答えて

0

行列M(行)×N(列)の場合、目的のアルゴリズムの1回転が行列の周囲を印刷します。次のターンは(M-2)x(N-2)の行列(特別な方法でメモリに格納されます)を取得します。この事実は、効率的な反復式を可能にする。

上記のアルゴリズムを利用しましょう。次に、ターンは次のようになります。

COLUMNAHEAD(M); ROWAHEAD(N-1); COLUMNBACK(M-1); ROWBACK(N-2); 

ここで、印刷する要素の数はカッコで示しています。必要なアルゴリズムのスケッチがどのように見えるの詳細は

- pointer to the current element (your ds:bx) 
- values M and N, kept until algorithm stopped 
- shift parameter, let be D 

:これらの数値のいずれかが0

だから、あなたはマトリックス自体の脇に、次の変数が必要に達したとき、アルゴリズムは停止する必要があります

D := 0 
label: 
if (M-D==0) stop 
COLUMNAHEAD(M-D) 
inc D 
if (N-D==0) stop 
ROWAHEAD(N-D) 
if (M-D==0) stop 
COLUMNBACK(M-D) 
inc D 
if (N-D==0) stop 
ROWBACK(N-D) 
goto label 

インデックス付けを正しく行うには、特に注意する必要があります(Mと1を変位値として使用)。変数の減分(DEC/JZまたはLOOP)またはより良いレジスタ使用(bxではなくsi)によって導かれるサイクルでの命令番号の最小化などの単純な最適化も推奨されます。また、行列は通常、列ごとにメモリに格納されます(1とNは正しい置換になります)。

+0

私のコードにあなたのコードを適用しようとしましたが、私は全く理解しません。私のコードで修正しようとすることができますか?あなたの説明は良いものでしたが、私は多くの経験をする必要はありません。あなたの説明にしたがってプログラムを書くことができれば、私にとっては非常に便利です。 Olionに感謝します – buuuuu