Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.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
在Linux NASM x86_64中,从结构中的sockaddr_打印属性_Linux_Assembly_X86 64_Nasm - Fatal编程技术网

在Linux NASM x86_64中,从结构中的sockaddr_打印属性

在Linux NASM x86_64中,从结构中的sockaddr_打印属性,linux,assembly,x86-64,nasm,Linux,Assembly,X86 64,Nasm,如何从结构中的sockaddr\u打印属性?例如,我想打印出套接字的端口或地址: ;; Data definitions struc sockaddr_in .sin_family resw 1 .sin_port resw 1 .sin_addr resd 1 .sin_zero resb 8 endstruc section .data ;; sockaddr_in structure for the address the listening socke

如何从结构中的sockaddr\u打印属性?例如,我想打印出套接字的端口或地址:

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

section .data

;; sockaddr_in structure for the address the listening socket binds to
pop_sa istruc sockaddr_in
    at sockaddr_in.sin_family, dw 2           ; AF_INET
    at sockaddr_in.sin_port, dw 0xce56        ; port 22222 in host byte order
    at sockaddr_in.sin_addr, dd 0             ; localhost - INADDR_ANY
    at sockaddr_in.sin_zero, dd 0, 0
iend
sockaddr_in_len     equ $ - pop_sa
sin_port_len     equ $ - pop_sa + sockaddr_in.sin_port

_start:

;; Print listen init message to stdout
mov       rax, 1             ; SYS_WRITE
mov       rdi, 1             ; STDOUT
mov       rsi, pop_sa + sockaddr_in.sin_port
mov       rdx, sin_port_len
syscall

mov        rax, 60
syscall

无论我尝试打印哪个属性,我都会得到输出:“V”�”。为什么会发生这种情况,以及如何获得预期的输出(即22222用于sin_端口)?

端口是二进制的。您需要在打印之前或之后转换为文本(例如,通过管道传输到hexdump)。另外,您的
sin\u port\u len
错误
/a.out | hd
提供
0000000056 ce
谢谢@Jester。我看到十六进制,56CE(十进制为22222)。在.asm文件中有什么方法可以做到这一点吗?是的,您需要自己将文本转换为十六进制或十进制。如果您可以使用C库,也可以调用
printf