1

我正在研究如何将 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

有没有人有更好的主意?

4

1 回答 1

4

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
于 2012-11-24T23:29:47.643 回答