1

Y86 アセンブリ コードに変換しようとしている次の IA32 アセンブリ コードがあります。

bubble_a:
    pushl   %ebp
    movl    %esp, %ebp
    pushl   %edi
    pushl   %esi
    pushl   %ebx
    movl    8(%ebp), %edx
    movl    12(%ebp), %edi
    subl    $1, %edi
    testl   %edi, %edi
    jg  .L11
    jmp .L8
.L9:
    movl    4(%edx,%eax,4), %ecx
    movl    (%edx,%eax,4), %ebx
    cmpl    %ebx, %ecx
    jge .L4
    movl    %ebx, 4(%edx,%eax,4)
    movl    %ecx, (%edx,%eax,4)
.L4:
    addl    $1, %eax
    cmpl    %edi, %eax
    jne .L9
.L7:
    subl    $1, %edi
    je  .L8
.L11:
    movl    $0, %eax
    testl   %edi, %edi
    jg  .L9
    jmp .L7
.L8:
    popl    %ebx
    popl    %esi
    popl    %edi
    popl    %ebp
    ret

.L9 の movl 命令を翻訳するのに苦労しています

movl    4(%edx,%eax,4), %ecx
movl    (%edx,%eax,4), %ebx
movl    %ebx, 4(%edx,%eax,4)
movl    %ecx, (%edx,%eax,4)

これを実行する単一の命令がないことはわかっていますが、どの命令セットが Y86 の命令セットに取って代わるのかわかりません。

助けてくれてありがとう。

4

1 に答える 1

1

ご存知のように、Y86 には柔軟で複雑なアドレッシング スキームがありません。したがって、あなたの仕事は、複数の命令を使用して、x86 命令で行われる計算をシミュレートすることです。また、アセンブリ コードの意味を理解すると、作業が軽減されます。
あなたが選んだ 4 行のコードを見てみましょう

movl    4(%edx,%eax,4), %ecx  
movl    (%edx,%eax,4), %ebx  
movl    %ebx, 4(%edx,%eax,4)  
movl    %ecx, (%edx,%eax,4)  

R[%edx]+R[%eax]*4それが行う主な仕事は、アドレスと に格納されている 2 つの数値を交換することR[%edx]+R[%eax]*4+4です。これらのアドレスを計算するには、それらを自分で合計する必要があります。これを Y86 に変換する方法は次のとおりです。

rrmovl %eax, %esi  
addl %esi, %esi  
addl %esi, %esi  
addl %edx, %esi  
mrmovl 4(%esi), %ecx  
mrmovl (%esi), %ebx  
rmmovl %ebx, 4(%esi)  
rmmovl %ecx, (%esi)  

R[%edx]+R[%eax]*4最初の 4 行は、 に格納されている値 (最初に double を 2 回、次に plus) を計算します%esi。以下は非常に単純です。

于 2013-11-20T13:43:40.503 に答える