Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets 从程序集接收分段故障_Sockets_Assembly_Nasm - Fatal编程技术网

Sockets 从程序集接收分段故障

Sockets 从程序集接收分段故障,sockets,assembly,nasm,Sockets,Assembly,Nasm,下面的汇编代码在套接字中获取消息时出现分段错误 global _start struc sockaddr_in .sin_family resw 1 .sin_port resw 1 .sin_addr resd 1 .sin_zero resb 8 endstruc struc img .source_ip resb 4 .int_ip resb 4 .group_ip resb 4 endstruc section .bss

下面的汇编代码在套接字中获取消息时出现分段错误

global _start

struc sockaddr_in
    .sin_family resw 1
    .sin_port resw 1
    .sin_addr resd 1
    .sin_zero resb 8
endstruc

struc img
    .source_ip  resb 4
    .int_ip resb 4
    .group_ip   resb 4
endstruc

section .bss

    listen_socket:  resq 1
    buffer: resb 2048

section .data

pop_sa istruc sockaddr_in
        at sockaddr_in.sin_family, dw 2           ; AF_INET
        at sockaddr_in.sin_port, dw 0x4b9c        ; port 40011
        at sockaddr_in.sin_addr, dd 0xb46c0ef             ; INADDR_ANY
        at sockaddr_in.sin_zero, dd 0, 0
iend
sockaddr_in_len     equ $ - pop_sa

pop_mc  istruc img  ;
    at img.source_ip,   dd 0xb46c0ef ;
    at img.int_ip,      dd 0             ; INADDR_ANY
    at img.group_ip,    dd 0x5a81320a ;
iend
img_len equ $ - pop_mc
from_ip:    dw 0    
from_ip_len:    db 16

section .text

_start:

    mov rdi, 2      ;AF_INET
    mov rsi, 2      ;SOCK_DGRAM
    mov rdx, 0      ;IPPROTO_UDP
    mov rax, 41
    syscall         ;sys_create_udp_socket
    mov[listen_socket], rax

    mov r8, 4        
    mov r10, 1   
    mov rdx, 2  ;SO_REUSEADDR
    mov rsi, 1  ;SOL_SOCKET
    mov rdi,[listen_socket]
    mov rax, 54
    syscall         ;sys_setsockopt

    mov rdx, sockaddr_in_len
    mov rsi, pop_sa
    mov rdi,[listen_socket]
    mov rax, 49
    syscall         ;sys_bind

    mov r8, img_len
    mov r10, pop_mc
    mov rdx, 39     ;IP_ADD_SOURCE_MEMBERSHIP
    mov rsi, 0  ;IPPROTO_UDP
    mov rdi,[listen_socket]
    mov rax, 54
    syscall         ;sys_setsockopt

    mov r9, [from_ip_len]   ;
    mov r8, [from_ip]
    mov r10, 0
    mov rdx, 2047
    mov rsi, buffer
    mov rdi,[listen_socket]
    mov rax, 45
    syscall         ;sys_recvfrom

    mov rdi, 0
    mov rax, 60
    syscall         ;sys_exit
所有syscall在sys\u recvfrom之前返回正确的值,在sys\u recvfrom函数中得到error-EFAULT,怎么了?64位程序集nasm.

r8和r9(sockaddr和socklen)应为指针类型。将值从一个地址从一个dw变量移到一个寄存器中,您的意思是将lea用于r8吗?即使这样,将指针传递给一个两字节的变量,您说这个变量大16字节(socklen)

我的汇编器,尤其是与unix相关的汇编器已经生锈了,但我猜是的

  • 您认为dw是16字节,而它是16位
  • 使用mov reg[variable]而不是使用lea reg[variable]将值加载到r8、r9中

  • 感谢Marco van de VoortIn,在这种情况下,我在rax寄存器中得到了消息的长度,这没关系,但在缓冲区中没有数据。