gpt4 book ai didi

c - 如何在汇编中正确调用函数

转载 作者:行者123 更新时间:2023-11-30 17:40:52 25 4
gpt4 key购买 nike

我在互联网上找到了这个递归斐波那契汇编代码,我试图改进它,以便打印出结果。事情是,如果我添加 _main 函数并简单地说

call _fibo

在那里,程序将崩溃(更不用说添加更多代码)。我认为调用者必须清理参数等等,但在我看来,如果没有进一步的代码要执行,它应该可以工作。有什么指点吗?

_fibo:
push ebp
mov ebp, esp
sub esp, 16 ; ...AA-A-A-ND we've built the stack frame

mov eax, [ebp+8]
cmp eax, 2
jae .recur

xor edx, edx
jmp .done

.recur:
sub eax, 2
push eax ; compute fib(n-2)
call _fibo
mov [ebp-8], eax ; save returned value in 8-byte local variable...
mov [ebp-4], edx ; ...in Little-Endian byte order.

mov eax, [ebp+8] ; get argument again
dec eax
push eax ; compute fib(n-1)
call _fibo
mov [ebp-16], eax ; save returned value in 8-byte local variable...
mov [ebp-12], edx ; ...in Little-Endian byte order.

; the next steps are not as efficient as they could be...
mov eax, [ebp-8]
mov edx, [ebp-4] ; retrieve 1st computed value
add eax, [ebp-16]
adc edx, [ebp-12] ; add 2nd computed value
.done:
mov esp, ebp
pop ebp
ret
;----------------------------------------------------------------

http://montcs.bloomu.edu/Code/Asm.and.C/Asm.Nasm/fibonacci.shtml

最佳答案

最简单的方法是用 C 语言编写 main,分别编译两个部分,然后将它们链接到一个可执行文件中。以下是 Linux 的示例:

#include <stdio.h>

extern long __attribute__((cdecl)) _fibo(int n);

int main()
{
int number = 10;
long result = _fibo(number);
printf("%ld\n", result);
return 0;
}

注意:从我的想法来看,在 Windows 中你应该调用不带下划线的 fibo ;并且 __attribute__((cdecl)) 必须是 __cdecl

将此行添加到 fibo.asm 以将 _fibo 暴露给 main:

global _fibo

编译/链接两个模块:

nasm -f elf fibo.asm
gcc main.c fibo.o

如果你坚持用汇编语言编写main,你就必须学习calling conventions ,正如您可能已经从 keshlam 的答案中猜到的那样。为了帮助您入门,_fibo 使用 cdecl。您可能会在这里找到一些非常有用的代码示例:http://cs.lmu.edu/~ray/notes/nasmexamples/

关于c - 如何在汇编中正确调用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21353369/

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