如何将指令从IA32转换为Y86

时间:2013-11-19 17:48:03

标签: assembly x86 ia-32 y86

我有这个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中的指令。

感谢您的帮助。

1 个答案:

答案 0 :(得分: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)  

它的主要工作是交换存储在地址R[%edx]+R[%eax]*4R[%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(第一次加倍,然后是加号),存储在%esi中,以下内容非常简单。