(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
ror
和movzwl
在这做什么?
答案 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上的线索。)