0

印刷しようとしている配列があります。正しいかどうか確認できるように印刷したいと思います。現在、1番を印刷して停止しています。または、ECXを別の方法でいじると、ゼロの束が出力されてクラッシュします。

これが私のプログラムです。

.data

array DWORD 10 DUP(5, 7, 6, 1, 4, 3, 9, 2, 10, 8)
my_size dd 10

sorted DWORD 0
first DWORD 0
second DWORD 0

.code

start:
main proc
cls

 mov EBX, offset[array]
 mov ECX, [my_size]
 dec ECX
 sub ESI, ESI
 sub EDI, EDI

; print
mov EBX, offset aa
sub ECX, ECX
;mov ECX, my_size
mov ECX, 10

my_loop:
mov EAX, [EBX]
inc EBX
dec ECX

cmp ECX, 0
jle exit_loop

mov first, EAX
print chr$("printing array elements: ")
print str$(first)

loop  my_loop

exit_loop:
ret

main endp

; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤

end start
4

2 に答える 2

2

私はそれを言うのは嫌ですが、あなたはバブルソートを書く「準備ができていません」。それは完全に正気でない宿題であるか、またはあなたはこれまでクラスをフォローしていません(おそらく両方)。

まず第一に、配列を正しく定義していないと思います。私があなたのコードを読んでいると、そこには100個のdwordがあります-あなたが指定した10個の数字の10個のコピーです。そこに「DUP」は必要ありません。

その部分が正しいことを確認するために、最初にソートされていない配列を印刷します。あなたはそこにいくつかのマクロを使用しているように見えます-それらは確かに指示ではありません。名前からすると、「print_chr $」は1文字を印刷し、「print_str $」は文字列を印刷すると思います(ただし、文字列と数字の1を印刷しているように見えます)。マクロセットに「print_int$」がある場合は、それが必要だと思います(!)。私はあなたのマクロに精通していないので、私は間違っている可能性があります。

配列を「dword」として定義しましたが、ソートルーチンでは1バイトのみを比較します。これは、使用している少数の場合におそらく機能しますが、実際には正しくありません。

バブルソートを実行する通常の方法は、配列を実行するたびに「フラグ」(レジスタまたは変数-これが「ソート」の目的である可能性があります)をゼロに設定し、毎回1に設定することです。スワップを行います。配列のパスを実行してもフラグがまだゼロの場合(スワップは実行されていません)、その場合にのみ、配列が並べ替えられます。各パスの後に配列を印刷すると、それが「バブル」ソートと呼ばれる理由がわかります。最小/最大数が最終位置まで「バブルアップ」します。

dword配列(esi * 4)をウォークスルーするコードは(バイトを比較するだけでなく)ほぼ正しく見えますが、印刷ルーチンはループを通過するたびにebxを1つずつインクリメントするだけです。「ebx、4を追加」するか、「ebx * 4」(両方ではない)を使用してdwordを印刷します。それとも、配列はバイトだけであると想定されていますか?

真剣に、私はもっと単純なものから始めて(配列を出力するだけです)、それが機能した後、ソートルーチンを追加するまで作業を進めます。

それが役に立てば幸い。

最高、フランク

于 2012-07-24T18:35:47.597 に答える
0

コードを簡略化したようです。良いアイデア!使用しているマクロ「print_str$」については、まだよくわかりません。それは数字を印刷するように私には「見えません」。「print_int$」などはありますか?最初の数字「5」だけを印刷できるのであれば、それは良いスタートです。

今...あなたのループを介して作業している、あなたはただ「incebx」です。次のdwordは取得されません。最初のdwordからバイト2、3、および4が取得され、2番目のdwordから最初のバイトが取得されます。(削除された)ソートコードで「* 4」を使用したので、ここでは「[ebx*4]」が必要になる可能性があります。それか、ループを通過するたびにebxに4を追加します。どちらか一方(両方ではない)がdwordの配列をステップスルーする必要があります。

最初のステップは、「正しい」マクロを選択して数値を出力することだと思います。おそらくそこから簡単になるでしょう(?)。勇気!:)

最高、フランク

于 2012-07-27T20:38:09.430 に答える