Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 如何将参数(通过C函数调用传递)保存到汇编程序x86-64中的全局变量?_Assembly_X86 64 - Fatal编程技术网

Assembly 如何将参数(通过C函数调用传递)保存到汇编程序x86-64中的全局变量?

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

在我的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     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最后,请注意节名不以冒号结尾!