1

我有这个 IA32 汇编代码,我正在尝试将其转换为 Y86 汇编代码:

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 指令中完成的计算。而且,理解汇编代码的含义会减少你的工作量。
让我们看看你挑出来的四行代码

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

它的主要工作是交换存储在 addressR[%edx]+R[%eax]*4和的两个数字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(先是 double 两次,然后是 plus),存储在 中%esi,下面很简单。

于 2013-11-20T13:43:40.503 回答