Tweet

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 命令でのオペランドとして与えられる値が素直に「関数のポインタ」の値として入っていることになります.


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2009-11-29 (日) 09:39:48 (3608d)