gpt4 book ai didi

c - 使用 "lea ($30, %edx), %eax 将 edx 和 30 相加并放入 eax

转载 作者:太空宇宙 更新时间:2023-11-04 08:35:48 26 4
gpt4 key购买 nike

我正在为明天的期中考试学习,上一次期中考试的问题之一是:

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

谢谢。

最佳答案

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

leal 30(%edx), %eax

符号是位移(baseregisteroffsetregisterscalarmultiplier)。位移放在外面。 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 %ebp, pushl %ebp 离开等)

关于c - 使用 "lea ($30, %edx), %eax 将 edx 和 30 相加并放入 eax,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26248330/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com