0

x86アセンブリでバブルソートを実行しようとしています(さまざまなタイプのソートに関する速度の最適化については気にしないため、バブルである必要があります)。何らかの理由で、コードが必要な値をスワップしません。これが私のコードです

mov eax, list                   ;store list in eax
mov edx,[eax+4*edi-4]           ;temp = var1
cmp edx,[eax+edi*4]             ;compare
JLE SECOND_LOOP                 ;jump if var1 < var2
mov [eax+4*edi-4],[eax+edi*4]   ;var1 = var2
mov [eax+edi*4], edx            ;var2 = temp
jmp SECOND_LOOP

一時をアドレスにロードすることになっている最後のmov命令では、そうではありません。EAXレジスタには、値のリストを含む配列の開始アドレスがあります

0x*starting address* 0a 00 00 00 ec ff ff ff 05 00 00 00 0c 00 00 00 1e 00 00 00 fb ff ff ff ea
0x*address after   * ff ff ff 37 00 00 00 34 00 00 00 00 00 00 00

次のアドレスにはさらにいくつかの番号が含まれています。10進数では、数字は10 -20 5 12 30 -5 -22 55 52 0です。基本的に今、私はに移動してからに移動しようとしFFFFFFEC0000000A0000000AますFFFFFFEC。一時レジスタEDXに保存できますが、EDXの値を特定のアドレスに保存できません。何か助けはありますか?

4

2 に答える 2

3

使用するたびにスケーリングする必要があるインデックスの代わりに、リストの現在の位置へのポインターを使用すると思います。

    mov esi, offset list
top:
    mov edi, esi
inner:
    mov eax, [edi]
    mov edx, [edi+4]
    cmp eax, edx
    jle no_swap
    mov [edi+4], eax
    mov [edi], edx
no_swap:
    add edi, 4
    cmp edi, list_end - 4
    jb inner
    add esi, 4
    cmp esi, list_end - 4
    jb top
于 2012-07-16T04:29:15.703 に答える
1

コードのこの部分:

mov edx,[eax+edi*4]
mov [eax+edi*4], edx

事実上、メモリ内の何も変更しません。メモリから値を読み取り、取得したばかりの場所に書き戻します。

ところで、あなたはxchg命令に興味があるかもしれません。

于 2012-07-16T04:35:44.737 に答える