Как понять реализацию ntohs? - PullRequest
3 голосов
/ 14 апреля 2011
(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 здесь делают?

1 Ответ

10 голосов
/ 14 апреля 2011

ror означает «повернуть вправо», а movzwl означает «переместить слово, расширяющее ноль на длинное» (по историческим причинам, начиная с 8086 года, во всей документации x86 «слова» только 16 бит).

Итак:

ror     $0x8, %di

Повернуть 16-битное значение в регистре di (который в x86-64 содержит первый целочисленный аргумент функции) на восемь бит; другими словами, обменяйте его старшие и младшие байты. Это часть, которая на самом деле делает работу ntohs.

movzwl  %di, %eax

Скопируйте 16-битное значение в di в eax, увеличив нулевое значение до 32-битного значения. Эта инструкция необходима, поскольку целочисленное возвращаемое значение функции входит в eax, а если оно короче 32 бит, оно должно быть расширено до 32 бит.

retq

Возврат из функции. (q - это просто подсказка, что вы работаете на x86-64.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...