我正在为明天的期中考试做准备,上一次期中考试的一个问题是:
考虑下面的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 谢谢。
发布于 2014-10-08 05:17:07
如果您想简单地使用leal添加30,那么您应该这样做:
leal 30(%edx), %eax表示法是displacement(baseregister,offsetregister,scalarmultiplier)。位移放置在外部。30被添加到edx中并存储在eax中。在AT&T/GAS表示法中,您可以同时省略偏移量和乘数。在我们的示例中,这给我们留下了相当于本例中的base + displacement或edx + 30的内容。
cHao也提出了一个好的观点。假设教授要求你优化你的代码。myFunction不使用局部变量,也不需要堆栈空间,这一事实存在一些效率低下的问题。因此,所有堆栈帧的创建和销毁都可以删除。如果您移除堆栈框架,那么您也不再是push %ebp了。这意味着您的第一个参数int a位于4(%esp)。考虑到这一点,您的功能可以简化为这样简单的内容:
.global _myFunction
_myFunction:
movl 4(%esp), %eax
addl $30, %eax
ret当然,当您更改您的函数以使它需要在堆栈上存储东西时,您必须将堆栈帧代码放回(pushl %ebp、pushl %ebp、leave等)。
https://stackoverflow.com/questions/26248330
复制相似问题