如何理解ntohs的实现?

com*_*ler 3 assembly

(gdb) disas htons
Dump of assembler code for function ntohs:
0x00000037aa4e9470 <ntohs+0>:   ror    $0x8,%di
0x00000037aa4e9474 <ntohs+4>:   movzwl %di,%eax
0x00000037aa4e9477 <ntohs+7>:   retq 
Run Code Online (Sandbox Code Playgroud)

这里做什么rormovzwl做什么?

zwo*_*wol 10

ror代表"向右旋转",movzwl代表"移动,零延伸到长"(由于历史原因,一直追溯到8086,在所有x86文档中"单词"仅为16位).

所以:

ror     $0x8, %di
Run Code Online (Sandbox Code Playgroud)

将寄存器中的16位值di(在x86-64上,包含函数的第一个整数参数)右移8位; 换句话说,交换它的高字节和低字节.这是实际完成工作的部分ntohs.

movzwl  %di, %eax
Run Code Online (Sandbox Code Playgroud)

将16位值复制dieax,将其零扩展为32位值.该指令是必需的,因为函数的整数返回值进入eax,如果它小于32位,则必须扩展到32位.

retq
Run Code Online (Sandbox Code Playgroud)

从功能返回.(这q只是你在x86-64上的线索.)