2017-01-03 10 views
1

私は与えられた配列の最小値を計算するコードを書いています。考えられるのは最初の要素をとり(最小値だと考えて)、残りの要素(4アセンブリ内の指定された配列の最小値を見つけます。

array dw 7,4,12,5,1 

mov si,00h 
mov ax,array[si] 


mov cx,5 

minimum: 

inc si ;find the minimum value 
mov dx,array[si] 
cmp ax,dx 
jb nochange 

swap: 
xchg ax,dx 

nochange: 
dec cx 
cmp cx,0 
JNE minimum 

lastcmp: ; to compare the last item with the minimum value and swap if it's smaller 
mov dx,array[si] 
cmp ax,dx 
jb endi 
xchg ax,dx 


end 

が、私はここでの問題を持っているように、それはいつも私を与えるので、それはすべての要素ではなく、最後の1を比較するように思える。そして、ここで私は1つを小さく見つけるその場合には値を交換しては私のコードです)それは私に(1)、助けを与えることです!

+3

Damn ... **決して使わないで 'array [si]' never!あなたは何をしているのか分からない。あなたの配列は、バイトではない単語の配列です!アセンブリにはインデックス付き配列アクセスはありません! –

+0

あなたは最後のステップ "lastcmp"を意味します!私はそれを比較できるようにdxレジスタに移動しました! –

+1

いいえ、私はこれを意味します。 –

答えて

1
mov cx,5 

あなたプロセスへは合計でわずか5の要素を持つ配列。別のステップで最初の要素を取り除いたので、コードは残りの4つの要素との比較しか実行できません。


inc si 

配列は言葉が含まれているので、あなたは、次の配列要素に進めるために2によってSIレジスタを増やす必要があります。 mov dx,array[si]のような命令では、[si]部分は実際には配列内のオフセット(バイト数で表される変位)であることに注意してください。通常の高水準言語のようなインデックスではありません。


dec cx 
cmp cx,0 
JNE minimum 

以下の条件ジャンプの必要に応じてdec cx命令は既にゼロフラグを定義するので、ここでcmp cx,0命令は全く役に立ちません。コードを短く:

dec cx 
jnz minimum 

lastcmp: ; to compare the last item with the minimum value and swap if it's smaller 
mov dx,array[si] 
cmp ax,dx 
jb endi 
xchg ax,dx 

は、なぜあなたは、この最後のセクションが必要だと思いますか?結果はすでにAXレジスタにあります。さらに、SI登録を変更していないので、この余分な比較はループで最後に行ったものと重複しています!

関連する問題