NASM C 中使用的过程。是否可以修改在 C 中调用的函数中使用的参数,该函数是 NASM 中的过程?

NASM Procedure used in C. Is it possible to modify the arguments used in a function called in C that is a procedure in NASM?

基本上我想更改下面 C 代码中使用的变量 a(不执行 a = add(a, 6); 因为我打算使用需要在不同函数中更改的多个参数用于在 C 中模拟与 NASM 链接的 CPU 以执行每条指令):

//main.c
#include <stdio.h>

extern int add(int a, int b);

int main(void){
    int a = 4;
    printf("%d\n", add(a, 6)); //Prints 10
    printf("%d\n", a);         //Prints 4, I want it to maintain the value
    return 0;
}

这里是汇编代码:

;add.asm
global add

add:
    mov eax, [esp + 4] ;argument 1
    add eax, [esp + 8] ;argument 2
    ret

然后我编译它:nasm -f elf add.asm ; gcc -m32 main.c add.o ; ./a.out

上面的代码代表了我想要实现的目标。 我正在考虑使用宏,但到目前为止我发现我认为使用 nasm.

是不可能的

调用函数的实现方式无关紧要,C 或汇编程序或任何其他语言。由于您通过值 向函数 提供了两个参数,因此它无法更改原始变量,它们是副本。

您需要传递 引用,在 C 中这些是要更改的变量的地址。

您的汇编程序函数只是更改传递的参数。这是允许的并且可以,但它不会影响调用者中的变量。您可能希望将参数视为局部函数变量。

将函数改为传递指针,然后修改指针对象的值:

extern int add(int *a, int b);

...

printf("%d\n", add(&a, 6)); //Prints 10

在汇编代码中,这意味着使用了一个额外的间接级别。所以代码例如看起来像这样:

;add.asm
global add

add:
    mov ecx, [esp + 4] ; pointer to argument 1
    mov eax, [esp + 8] ; argument 2
    add eax, [ecx]     ; *a + b
    mov [ecx], eax     ; *a = *a + b
    ret