gpt4 book ai didi

c - 由于某种原因,Mov 和 add 什么都不做

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

我从我的大学教授那里得到这段代码,所以我相当确定代码有效,但对我来说输出始终为 0。

我在 Windows 和虚拟 Ubuntu 机器上都试过了,但还是一样。

我正在使用 mingw 进行编译:

gcc test.c test.s

这是C代码:

#include <stdio.h>

int func(int a, int b);

int main()
{
int a, b;
scanf("%d %d", &a, &b);
printf("%d\n", func(a, b));
return 0;
}

这是汇编:

.intel_syntax noprefix

.text

.globl _func

_func:

enter 0,0

mov eax, edi
add eax, esi
leave
ret

对于输入 2 和 3,它应该输出 5,但它始终为 0。

最佳答案

这部分汇编语言...

    mov eax, edi
add eax, esi

... 是将前两个 int 参数添加到函数并返回结果的一种正确方法,if 前两个 int 函数的参数在寄存器 ediesi 中。在 x86 Linux 上,当且仅当程序是使用“64 位 ABI”编译的时才是正确的,这可能是也可能不是您的 Ubuntu 虚拟机默认执行的操作。据我所知,无论 ABI 是什么,在 Windows 上都不是这样。

但是,Linux 64 位 ABI 的使用与汇编语言的其余部分不一致:特别是在 Linux(所有变体)上,名为 func 的 C 函数对应于一个汇编语言语言过程名为 func,而不是 _func。但这应该会导致您的程序无法链接(gcc 命令会产生一条错误消息,指出“对 `func' 的 undefined reference ”),而不是产生不正确的输出。

我建议你回到给你汇编代码的教授那里,问他们应该使用什么操作系统和 ABI,以及如何使其适应你可以方便访问的计算机。

(您之前可能没有遇到过术语“ABI”。它代表应用程序二进制接口(interface),它是关于过程调用等低级细节如何工作的一堆规则。例如,“x86- 64 ELF ABI”,这是 Linux 使用的,表示函数调用的前两个整数参数在 CALL 指令之前放置在 DI 和 SI 寄存器中(按此顺序),并且整数返回值将在 AX 中找到在它返回之后。但是 x86-64 Windows ABI 表示函数的前两个整数参数被放置在其他两个寄存器中——我不记得是哪两个——而 x86- 32 ELF ABI 说他们进入堆栈。但每个人都同意出现在 AX 中的整数返回值。)

关于c - 由于某种原因,Mov 和 add 什么都不做,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54375072/

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