例えば次のコード
long *p;
char buf[32];
p = (long*)&buf[1];
*p = 0;
は、misalignアクセスであり、多くのプロセッサでは例外が発生する。
x86でも同様に例外を発生させてやるには、EFLAGSレジスタのbit18、AC(Alignment Check)ビットを1にしてやれば良い。
gccのインラインアセンブラの例。
__asm__ __volatile__ (
"pushf\n"
"\tpopl %%eax\n"
"\tor $0x00040000, %%eax\n"
"\tpushl %%eax\n"
"\tpopf\n"
:::"%eax");
これが何の役に立つかと言うと、
・misalignアクセスで例外が発生するプロセッサ上で動作させるコードを作成したい。
・でも、そのテストはx86(Linuxなど)上で行いたい。
という場合。
参考:
X86 Assembly/X86 Architecture
Mis-aligned pointers on x86
GCC Inline Assembler
09/12/11 追記:
この機能、実はあまり使えないような気がしてきた。
なぜなら、glibcはACが0である事を期待したコードになっていて、ACを1にするとglibcの関数で落ちるから。
0 件のコメント:
コメントを投稿