gpt4 book ai didi

无法将参数从 C 传递到汇编代码

转载 作者:行者123 更新时间:2023-11-30 18:40:55 24 4
gpt4 key购买 nike

据我了解,当在C语言的函数调用中传递参数时,被调用者可以在[ebp+8]处找到第一个参数。
通过 eax 返回值对我有用,但从堆栈中读取正确的参数值则不行。

现在我只是想编写一个汇编函数,它可以从 C 调用并返回与传递的值相同的值。

当我运行以下程序时,无论传递给 myFunc 的值是什么,它都会将 number: 1 打印到控制台。我做错了什么?

<小时/>

程序集

section .text
global _myFunc

_myFunc:
mov eax, [ebp+8]
ret

ma​​in.c

#include <stdio.h>

extern unsigned int myFunc(unsigned int somedata);

int main() {
unsigned int i = myFunc(6);
printf("number: %i\n",i);
return 0;
}

我使用 Mac、nasm 来汇编代码,使用 gcc 来进行 C 编译。

Makefile

macho32:
nasm -f macho32 assembly.s
gcc -m32 -o macho32 assembly.o main.c

最佳答案

您需要首先通过保存esp来设置访问参数。对此进行了解释:

http://www.nasm.us/doc/nasmdoc9.html

在“9.1.2 函数定义和函数调用”部分

以下内容适合我

程序集.s

section .text
global myFunc:function

myFunc:
push ebp
mov ebp, esp
mov eax, [ebp+8]
mov esp, ebp
pop ebp
ret

main.c

#include <stdio.h>

extern unsigned int myFunc(unsigned int somedata);

int main() {
unsigned int i = myFunc(6);
printf("number: %i\n",i);
return 0;
}

组装与编译

ericu@eric-phenom-linux:~$ nasm -f elf32 assembly.s 
ericu@eric-phenom-linux:~$ gcc -m32 assembly.o main.c
ericu@eric-phenom-linux:~$ ./a.out
number: 6

我使用的是 Linux 机器,所以我使用 elf32。在您的 Mac 上使用 macho32 是正确的。

关于无法将参数从 C 传递到汇编代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24351533/

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