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