如何正确地将缓冲区指针传递给x86_64程序集中的Linux系统调用?

que*_*fdy 2 linux assembly x86-64 system-calls

您好,我正在尝试学习如何在Linux上使用x86_64程序集进行系统调用。我遇到了一个问题,我似乎无法弄清楚如何正确地传递的参数getpeername

在使用C的此链接中,似乎他们正在使用运算符的地址来传递参数。我不知道如何在程序集中复制它。当我在缓冲区中不使用方括号时,这是strace。

首先,我在.data节中定义了我的缓冲区

ip_buff:  times 14 db 0
.length: equ $-ip_buff
Run Code Online (Sandbox Code Playgroud)

这是一个宏

%define SYS_getpeername 52
Run Code Online (Sandbox Code Playgroud)

r12 存储套接字接受调用的返回值

syscall getpeername,r12,ip_buff,15
Run Code Online (Sandbox Code Playgroud)

这是不使用方括号的strace

[pid   749] accept(3, NULL, NULL <unfinished ...>
[pid   761] read(4, "", 1024)           = 0
[pid   761] write(1, "", 0)             = 0
[pid   761] getpeername(4, 0x600733, 0xf) = -1 EFAULT (Bad address)
Run Code Online (Sandbox Code Playgroud)

这是我使用方括号时的痕迹。

[pid   749] accept(3, NULL, NULL <unfinished ...>
[pid   745] read(4, "GET / HTTP/1.1\r\nHost: 127.0.0.1:"..., 1024) = 78
[pid   745] write(1, "GET / HTTP/1.1\r\nHost: 127.0.0.1:"..., 78) = 78
[pid   745] getpeername(4, NULL, 0xf)   = -1 EFAULT (Bad address)
Run Code Online (Sandbox Code Playgroud)

我该如何正确进行系统调用?

Jes*_*ter 5

实际的问题不是缓冲区,而是缓冲区的长度。请注意,在原型中您socklen_t *addrlen应该拥有一个指针。15您传递的值不是指针,因此不是-EFAULT

您应该将更.length: equ $-ip_buff改为ip_length: dd $-ip_buff,然后使用syscall getpeername,r12,ip_buff,ip_length