ARM Thumb 命令セット Thumb Interwork での関数へのポインタ †まぁ,どういう実装になってるかはだいたい予想は付くんだけど,一応確認してみます. ソース †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; } ポインタ自身の値(関数のアドレス)と,関数ポインタ経由での関数呼び出しを実行します. コンパイル †$ 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 コンパイルは難なく通る. 実行 †$ ./main 00008420 2 0000844d 2 thumb 関数のアドレスが奇数になってますね. bx 命令でのオペランドとして与えられる値が素直に「関数のポインタ」の値として入っていることになります. |