google-code-prettify

2009-12-10

x86のmisalignアクセス時に例外を起こす方法

x86ではmisalignアクセス時でも、例外を起こさずにアクセスする事ができる。
例えば次のコード

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 件のコメント: