我正在为明天的中期学习,其中一个关于前期中期的问题是:
考虑以下C函数。编写相应的汇编语言函数以执行相同的操作。
int myFunction (int a)
{
return (a + 30);
}
我写下的内容是:
.global _myFunction
_myFunction:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %edx
lea ($30, %edx), %eax
leave
ret
其中a是edx而a + 30是eax。在这种情况下,lea的使用是否正确?是否需要
lea ($30, %edx, 1), %eax
感谢。
答案 0 :(得分:2)
如果您只想使用leal
添加30,那么您应该这样做:
leal 30(%edx), %eax
表示法是displacement
(baseregister
,offsetregister
,scalarmultiplier
)。位移放在外面。 30
已添加到edx
并存储在eax
中。在AT& T / GAS表示法中,您可以省略偏移和乘数。在我们的示例中,在此示例中,我们使用了等效的base + displacement
或edx + 30
。
myFunction
不使用局部变量并且不需要自身的堆栈空间这一事实存在一些效率低下的问题。因此,可以删除所有堆栈帧的创建和销毁。如果删除堆栈框架,则不再push %ebp
。这意味着您的第一个参数int a
位于4(%esp)
。考虑到这一点,您的功能可以简化为:
.global _myFunction
_myFunction:
movl 4(%esp), %eax
addl $30, %eax
ret
当然,当您更改函数以便需要将内容存储在堆栈中时,您必须将堆栈帧代码放回(pushl %ebp
,pushl %ebp
,leave
等)