使用" lea($ 30,%edx),%eax添加edx和30并将其放入eax

时间:2014-10-08 02:31:55

标签: c assembly

我正在为明天的中期学习,其中一个关于前期中期的问题是:

考虑以下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 

感谢。

1 个答案:

答案 0 :(得分:2)

如果您只想使用leal添加30,那么您应该这样做:

leal 30(%edx), %eax

表示法是displacementbaseregisteroffsetregisterscalarmultiplier)。位移放在外面。 30已添加到edx并存储在eax中。在AT& T / GAS表示法中,您可以省略偏移和乘数。在我们的示例中,在此示例中,我们使用了等效的base + displacementedx + 30

cHao也提出了一个很好的观点。让我们说教授要求您优化代码。 myFunction不使用局部变量并且不需要自身的堆栈空间这一事实存在一些效率低下的问题。因此,可以删除所有堆栈帧的创建和销毁。如果删除堆栈框架,则不再push %ebp。这意味着您的第一个参数int a位于4(%esp)。考虑到这一点,您的功能可以简化为:

.global _myFunction
_myFunction:
    movl 4(%esp), %eax
    addl $30, %eax
    ret

当然,当您更改函数以便需要将内容存储在堆栈中时,您必须将堆栈帧代码放回(pushl %ebppushl %ebpleave等)