以下をせよ:
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()