2012-11-24 173 views
1

我學習如何IA32彙編代碼轉換爲Y86的彙編代碼,和我被困在下面的指令是在IA32代碼:IA32彙編代碼Y86彙編代碼:leal指令

leal(%edx, %eax), %eax 

我不能找到Y86代碼的等效指令。我有兩個版本,下面的人,雖然,但我不知道這是正確的:

版本1:

mrmovl (%edx), %ebx 
mrmovl (%eax), %esi 
addl %ebx, %esi 
rrmovl %esi, 5eax 

版本2:

addl %edx, %eax 

有沒有人有一個更好的主意?

回答

4

LEA不訪問內存,它只執行(地址)算術運算。因爲你的第二版是正確的。

請注意,在x86上LEA不會影響標誌,而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