2

eax で生成されたランダム値が、割り当てた配列内の値と同じかどうかをテストしようとしています。外側のループは配列を生成し、それを画面と配列に書き込みます。内側のループは、値が配列に存在するかどうかをテストすることになっています。内部ループを正しく実行していないことはわかっていますが、修正方法がわかりません。

うまく組み立てられますが、実行しようとすると、空白のコマンド ウィンドウ画面しか表示されません。また、Irvine32 ライブラリを使用しています。私のコードは以下の通りです:

編集:これまでのところ、皆さんの助けに感謝していますが、今は2つの問題があります. 1 つ目は、配列に対する一意性について eax の数値を評価しようとすると、実際にはアクセス違反エラーが発生することです。配列を生成してテストするための私のコードは次のとおりです。

RandomArray PROC uses EAX

    call Randomize 
    mov esi, OFFSET arr
    mov edi, OFFSET arr
    mov ebx, TYPE arr 
    mov ecx, 15
    L1:
        mov eax, [79 - 19]
        push eax
        call RandomRange
        add eax, 19
        search1:
                 mov edx,[esi]
                 cmp eax,edx                 ; compares the values in the array and the random int
                 je L1                       ; jumps if the values are equal
                 add esi,4                   ; moves to next byte to check again
                 loop search1                ; repeats loop
        mov [esi],eax
        pop eax
        add esi, ebx
        loop L1
    ret
RandomArray ENDP
        pop ecx     
        loop OUTER_LOOP

    jmp FINISHED

    SWAP:
        mov bl, [esi]
        mov dl, [esi+1]
        xchg bl,dl 
        mov [esi],dl 
        mov [esi+1],bl
        jmp CONTINUE 

    FINISHED:
    ret

事前にご協力いただきありがとうございます。

4

2 に答える 2

2

空白のコマンド ウィンドウ画面しか表示されない

search:
    mov ecx,elementcount
    cmp eax,[esi]
    je L1
    add esi,4
    loop search

ecx反復ごとにカウンターをリセットしているため、これは無限ループです。ecx の割り当てをループの外に移動すれば問題ありません。

mov ecx,elementcount

search:
    cmp eax,[esi]
    je L1
    add esi,4
    loop search

ところで、おそらくそのループを に置き換えることができますがrep scasd、これはまったく同じことを行うと思います。ただし、それが「より良い」かどうかはわかりません。

mov ecx,elementcount
rep scasd
je L1

免責事項: コードはテストされておらず、x86 asm を実行してから数年が経ちました :)

于 2011-10-12T08:19:24.113 に答える
0

単一の配列を変更せずに複数回検索していますか? 配列の長さは約 8 ~ 10 項目を超えていますか? その場合、アルゴリズム的にそれを行う最も速い方法は、配列を作成して外側のループで並べ替え、内側のループでルックアップを実行するたびにバイナリ検索を実行することです。バイナリ検索は O(log n) ですが、ここで行っているような単純な線形検索は O(n) です。

また、ヒントとして、アセンブリでの並べ替えは簡単です --- qsort を呼び出します。マシンコードで独自のものを書く価値はありません!

于 2011-10-12T10:37:57.797 に答える