首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用"lea“($ 30,% edx ),%eax添加edx和30,并将其放入eax

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

Stack Overflow用户
提问于 2014-10-08 02:31:55
回答 1查看 195关注 0票数 0

我正在为明天的期中考试做准备,上一次期中考试的一个问题是:

考虑下面的C函数。编写相应的汇编语言函数来执行相同的操作。

代码语言:javascript
复制
int myFunction (int a) 
{ 
    return (a + 30); 
} 

我写下的是:

代码语言:javascript
复制
.global _myFunction
_myFunction:
    pushl %ebp
    movl %esp, %ebp
    movl 8(%ebp), %edx
    lea ($30, %edx), %eax
    leave
    ret

其中,a是edx,a+30是eax。在这种情况下使用lea是正确的吗?它是否需要被

代码语言:javascript
复制
lea ($30, %edx, 1), %eax 

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-08 05:17:07

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

代码语言:javascript
复制
leal 30(%edx), %eax

表示法是displacement(baseregisteroffsetregisterscalarmultiplier)。位移放置在外部。30被添加到edx中并存储在eax中。在AT&T/GAS表示法中,您可以同时省略偏移量和乘数。在我们的示例中,这给我们留下了相当于本例中的base + displacementedx + 30的内容。

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

代码语言:javascript
复制
.global _myFunction
_myFunction:
    movl 4(%esp), %eax
    addl $30, %eax
    ret

当然,当您更改您的函数以使它需要在堆栈上存储东西时,您必须将堆栈帧代码放回(pushl %ebppushl %ebpleave等)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26248330

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档