以下をせよ:
test.c
#include <arpa/inet.h>
int main()
{
volatile uint32_t x = 0x12345678;
x = ntohl(x);
return 0;
}
次に、次のようにコンパイルします。
$ gcc -O3 -g -save-temps test.c
結果のファイルを分析するtest.s
か、代わりにobjdump -S test.o
.
私のマシン(Ubuntu 13.4)では、関連するアセンブラーは次のとおりです。
movl $305419896, 12(%esp)
movl 12(%esp), %eax
bswap %eax
movl %eax, 12(%esp)
ヒント:
- 305419896 は 10 進数で 0x12345678 です。
12(%esp)
volatile 変数のアドレスです。
- すべての
movl
指示は、のvolatile
-ness のためにそこにありx
ます。本当に興味深い命令は だけですbswap
。
- 明らかに
ntohl
、インライン組み込みとしてコンパイルされます。
さらに、(プリコンパイルされた出力) を見ると、が単純に であるtest.i
ことがわかります。これは、 を呼び出すだけのインライン関数です。ntohl
#defined
__bswap_32()
__builtin_bswap32()