Assembly 如何将参数(通过C函数调用传递)保存到汇编程序x86-64中的全局变量?
在我的test.c文件中:Assembly 如何将参数(通过C函数调用传递)保存到汇编程序x86-64中的全局变量?,assembly,x86-64,Assembly,X86 64,在我的test.c文件中: size_t var = 1000; foo(var); 在测试h中: int *foo(size_t var); 在test.asm中: global foo section .bss N: resd 0 ; ... foo: ; how can I get to "var" here and how can I write it to "N"? 我试着写一些东西,比如: push rbp mov rbp, rsp mov
size_t var = 1000;
foo(var);
在测试h中:
int *foo(size_t var);
在test.asm中:
global foo
section .bss
N: resd 0
; ...
foo:
; how can I get to "var" here and how can I write it to "N"?
我试着写一些东西,比如:
push rbp
mov rbp, rsp
mov rax, [rbp+8]
mov [N], rax
pop rbp
ret
或
…但在这两种情况下,我都得到了“分段错误(核心转储)”错误,事实上,我甚至不确定这里发生了什么。我正在使用nasm和gcc。下面是一个我无法使用的简短版本:注意,在amd64上,类UNIX操作系统(如Linux)通常遵循sysV ABI。除此之外,ABI还指定了参数如何传递给函数。在带有SysV ABI的amd64上,前几个参数在寄存器
rdi
、rsi
和rdx
中传递。因此,当调用foo
时,调用方将把var
放在rdi
中。所以正确的代码应该是这样的:
foo:
mov [N],rdi
ret
section .bss
N: resq 1
为了便于编写独立于位置的代码,您可能还希望使用指令指针相对寻址模式。这是使用rel
关键字完成的:
foo:
mov [rel N],rdi
ret
进一步注意,实际上需要为N
分配八个字节的存储空间。将N
的定义更改为如下内容:
foo:
mov [N],rdi
ret
section .bss
N: resq 1
这将为N
保留一个四字(八字节)
您可以在别处找到有关SysV ABI的更多信息。您使用什么汇编程序?这是nasm吗?是的。我正在使用nasm和gccI尝试这样做,但对我来说不起作用。这里有一个简短的版本,我无法使用@Jecke。请阅读我写的关于为
N
实际预留空间的说明resd
保留指定数量的双字。如果您写入resd 0
,则保留零个双字,这不足以存储一个四字(两个双字)。@Jecke最后,请注意节名不以冒号结尾!