在Linux NASM x86_64中,从结构中的sockaddr_打印属性
如何从结构中的sockaddr\u打印属性?例如,我想打印出套接字的端口或地址:在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
;; 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
。