Tweet


* ARM Thumb 命令セット Thumb Interwork での関数へのポインタ [#s9745d9f]

まぁ,どういう実装になってるかはだいたい予想は付くんだけど,一応確認してみます.

** ソース [#g9b2d49d]

main.c
 #include <stdio.h>
 
 extern int arm_callee ( int );
 extern int thumb_callee ( int );
 
 int main ( void )
 {
 	int (*func)(int);
 
 	func = arm_callee;
 	printf ( "%08x\t%d\n", func, func ( 1 ) );
 
 	func = thumb_callee;
 	printf ( "%08x\t%d\n", func, func ( 1 ) );
 
 	return 0;
 }

arm.c
 int arm_callee ( int a )
 {
 	return a + 1;
 }
 
thumb.c
 int thumb_callee ( int a )
 {
 	return a + 1;
 }

ポインタ自身の値(関数のアドレス)と,関数ポインタ経由での関数呼び出しを実行します.

** コンパイル [#ic1afad2]
 $ gcc -mthumb-interwork -mthumb thumb.c -c
 $ gcc -mthumb-interwork arm.c -c
 $ gcc -mthumb-interwork main.c -c
 $ gcc -mthumb-interwork main.o arm.o thumb.o -o main

コンパイルは難なく通る.

** 実行 [#s7f6b713]
 $ ./main
 00008420	2
 0000844d	2

thumb 関数のアドレスが奇数になってますね.
bx 命令でのオペランドとして与えられる値が素直に「関数のポインタ」の値として入っていることになります.

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS