gpt4 book ai didi

混淆了简单的汇编代码(IA32)

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

考虑以下 C 函数:

void f1(int i) 
{
int j=i+a;
}

int f2(int i)
{
return i+a;
}

及其汇编语言的翻译(由讲师提供):

#f1 translation :

subl $8, %esp
movl 12(%esp), %eax
movl %eax, 4(%esp)
movl 4(%esp), %eax
addl a, %eax
movl %eax, (%esp)
addl $8, %esp
ret

#f2 translation :

subl $8, %esp
movl 12(%esp), %eax
movl %eax, 4(%esp)
movl a, %eax
movl %eax, (%esp)
movl (%esp), %eax
addl 4(%esp), %eax
addl $8, %esp
ret

我试图画出并记下这两个汇编代码的每个步骤,但我根本看不出这两个代码如何导致不同的 C 代码。

按照惯例,寄存器 %eax 包含函数的返回值。如果我没记错的话,寄存器 %eaxBOTH 汇编代码的末尾包含值 (i+a) 尽管 f1 不返回任何内容

1) 这是为什么?究竟是什么告诉一个函数正在返回一个值?

此外,在这两个代码中,我们有两行,如下所示:

movl %eax, (%esp) 
movl (%esp), %eax

最后一个似乎是多余的,2) 是不是?

最佳答案

如果 ABI 说 EAX 包含返回值,则返回某些内容的函数将在那里具有返回值。如果函数不返回任何内容,则寄存器可能包含任何内容。在这种情况下它可能是相同的值,我没有阅读代码。

如果调用函数不读取返回值,则该寄存器包含的内容无关紧要。所以这都是关于调用者和被调用函数的。他们必须遵守 ABI。如果调用了 void 函数,调用代码将永远不会尝试将该寄存器用作任何东西。

所以汇编代码中没有任何内容表明函数返回了一些东西。这一切都在 C 代码中。

至于 2,MOV 是多余的。这是因为您没有使用优化进行编译,因此编译器将只输出它想要的任何简单内容,而且非常不理想。

关于混淆了简单的汇编代码(IA32),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37376673/

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