如何理解ntohs的实现?

时间:2011-04-14 02:45:37

标签: 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 

rormovzwl在这做什么?

1 个答案:

答案 0 :(得分:10)

ror代表“向右旋转”,而movzwl代表“移动,零延伸字长到”(历史原因一直追溯到8086,在所有x86文档中) “单词”只有16位。)

所以:

ror     $0x8, %di

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

工作的部分
movzwl  %di, %eax

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

retq

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