我正在研究如何将 IA32 汇编代码转换为 Y86 汇编代码,我被困在 IA32 代码中的以下指令中:
leal(%edx, %eax), %eax
我找不到 Y86 代码的等效说明。我有以下两个版本,但我不确定哪个是正确的:
版本 1:
mrmovl (%edx), %ebx
mrmovl (%eax), %esi
addl %ebx, %esi
rrmovl %esi, 5eax
版本 2:
addl %edx, %eax
有没有人有更好的主意?
LEA
不访问内存,它只做(地址)算术。因此,您的版本 #2 是正确的。
请注意,在 x86LEA
上不会影响标志,而ADD
会。LEA
还支持更复杂的有效地址语法,但仍可直接转录为 y86。例如,
leal offset(%eax, %ebx, 4), %edx
变成:
rrmovl %ebx, %edx
addl %edx, %edx
addl %edx, %edx
addl %eax, %edx
pushl %eax # save eax which used as temporary for adding the offset
irmovl $offset, %eax
addl %eax, %edx
popl %eax # restore eax