2011-04-14 32 views
3
(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在這裏做什麼?如何理解ntohs的實現?

回答

10

ror代表「向右旋轉」,而movzwl代表「移動,零延伸字到長」(由於歷史原因,一直追溯到8086,在所有x86文檔中「字」只有16位)。

所以:

ror  $0x8, %di 

旋轉寄存器di(其中,上X86-64,包含第一個整數參數的函數)的16位值右移8個比特;換句話說,交換其高位和低位字節。這是ntohs的工作。

movzwl %di, %eax 

拷貝到dieax的16位值,它以32位的值零擴展。該指令是必需的,因爲函數的整數返回值在eax之內,如果它小於32位,則必須擴展到32位。

retq 

從函數返回。 (q只是你在x86-64上的線索。)

+1

一個非常奇怪的事情,我是'disas htons',爲什麼'ntohs'顯示呢? – compiler 2011-04-14 03:03:11

+0

x86-64上的寄存器是64位,爲什麼不擴展到64位而不是32位? – compiler 2011-04-14 03:08:24

+0

...我以爲這是一個錯字!但可能是因爲它們完全一樣,所以有人認爲通過將'ntohs'和'htons'指向相同的代碼,他們可以從'libc.so'中擠出一些額外的字節。至於爲什麼不擴展到64位,除了「ABI說你擴展到32位」之外,我不知道任何答案,但最初的原理可能是像'mov [sz] wq'這樣的一個答案。在原始的x86-64芯片上比'mov [sz] wl'更多的循環。 – zwol 2011-04-14 03:18:15