【发布时间】:2019-11-27 13:43:18
【问题描述】:
您好,我正在尝试学习如何在 Linux 上使用 x86_64 程序集进行系统调用。我遇到了一个问题,我似乎无法弄清楚如何正确传递 getpeername 的参数。
在这个使用 C 的链接中,看起来他们正在使用运算符的地址来传递参数。我不知道如何在汇编中复制它。这是我的缓冲区不使用括号时的 strace。
首先我在 .data 部分中定义了我的缓冲区
ip_buff: times 14 db 0
.length: equ $-ip_buff
这是一个宏
%define SYS_getpeername 52
r12 存储来自套接字接受调用的返回值
syscall getpeername,r12,ip_buff,15
这里是不使用括号的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)
这是我使用括号时的strace。
[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)
我怎样才能正确地进行这个系统调用?
【问题讨论】:
标签: linux assembly x86-64 system-calls