Assembly 我应该将sockaddr存储在带有push的堆栈上,还是存储在syscall connect的寄存器中?
我今天开始学习ASM是为了好玩,我想弄明白的一件事是如何在ASM中打开TCP连接 我已经关闭了对socket()的调用,因为没有任何复杂的数据结构,我可以将值存储在注册表中 但是,我不知道如何处理open()系统调用,因为它需要指向sockaddr的指针Assembly 我应该将sockaddr存储在带有push的堆栈上,还是存储在syscall connect的寄存器中?,assembly,Assembly,我今天开始学习ASM是为了好玩,我想弄明白的一件事是如何在ASM中打开TCP连接 我已经关闭了对socket()的调用,因为没有任何复杂的数据结构,我可以将值存储在注册表中 但是,我不知道如何处理open()系统调用,因为它需要指向sockaddr的指针 ; socket() mov rax, 41 mov rdi, 20 ; AF_INET mov rsi, 1 ; SOCK_STREAM mov rdx
; socket()
mov rax, 41
mov rdi, 20 ; AF_INET
mov rsi, 1 ; SOCK_STREAM
mov rdx, 0 ; Protocol
syscall
; Valid socket?
cmp rax, 0
jle error
; connect()
mov rdi, rax ; rax stores fd, save into rdi before moving rax to syscall id
mov rax, 42
mov rsi,
在这一点上,我不确定我该做什么。我是否只是将值推送到堆栈上
提前感谢一个选项是将结构中的
sockaddr_推送到堆栈上,然后将rsi
设置到结构开头的地址
我不确定,但我认为您需要将sockaddr\u按相反方向推:堆栈向下扩展,但connect
将期望结构从低地址开始,到高地址结束
如果是这样的话,可以这样说:
长推(32位)0,两次(sin_zero[8])
推送长(32位)互联网地址(例如32位十进制形式的3232235777,相当于虚线四元组中的192.168.1.1)
短按(16位)端口(例如80)
短按20(自动对焦)
将esp的值放入rsi(将指向短20,这是结构的开始)
呼叫连接
但我支持前面的一条评论:您可以使用connect()
查看gcc创建的程序集作为一个小示例。首先,您将值存储在寄存器中,而不是“注册表”。至于如何在程序集中使用套接字,也许会给您一些答案。它是32位而不是64位,但看起来像您正在尝试做的。您可以始终使用“c”编写代码,然后生成asm输出并查看其外观。根据编译器的不同,汇编中有struct
定义。例如NASM/YASM
使用struct。。。endstruct
而MASM
使用名称结构。。。名称结束
。