我有这个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中的指令。
感谢您的帮助。
答案 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]*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
中,以下内容非常简单。