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
基本上我想更改下面 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