Как конвертировать инструкцию из IA32 в 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

Я изо всех сил пытаюсь перевести инструкции movl в.L9

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

Я знаю, что нет ни одной инструкции, которая будет это делать, но я не могу понять, какой набор инструкций заменит их в Y86.

Спасибо за любую помощь.

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]*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 (сначала дважды, а затем плюс), хранится в %esiи следующее довольно просто.

Другие вопросы по тегам