; Preparing to listen the incoming connection (passive socket)
; int listen(int sockfd, int backlog);
; listen(sockfd, 0);
mov eax, 102 ; syscall 102 - socketcall
mov ebx, 4 ; socketcall type (sys_listen 4)
; listen arguments
push 0 ; backlog (connections queue size)
push edx ; socket fd
mov ecx, esp ; ptr to argument array
int 0x80 ; kernel interruption (this is the "receive packet" call along with MOVs above)
We in userland are the ones responsible for calling that interruption in another thread and deciding what that thread should call when it's done. The low-level stuff is only concerned with system calls, not managing them for us.