我今天开始学习ASM是为了好玩,我试图弄清楚的一件事就是如何在ASM中打开TCP连接。
我已经调用了socket(),因为没有任何复杂的数据结构,我可以将值存储在注册表中
但是,我不知道如何为open()系统调用做什么,因为它需要一个指向sockaddr的指针
; 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,
此时我不确定我应该做什么。我只是将值推到堆栈上吗?
提前致谢
答案 0 :(得分:0)
一种选择是将sockaddr_in
结构推送到堆栈,然后将rsi
设置为结构开头的地址。
我不确定,但我认为您需要反向推动sockaddr_in
:堆栈增长但connect
期望结构从低地址开始并以高地址结束
如果是这样的话,那就是:
但我在之前的评论中说:你可以使用connect()
来查看gcc为一个小例子创建的程序集。