1

x86 マシンでメモリ アドレス アライメント エラーを作成したいと考えています。なぜ私はこれをしたいのですか?SIGBUS ハンドラを明示的にテストしたいからです。

これが私のテスト例です。

#include <stdio.h>

int main(int argc, char** argv) {
    unsigned char array[32];
    short *short_ptr;

    short_ptr = (short *)&array[1];
    *short_ptr = 0xffff;  // Store
    printf("value of c = %x", *short_ptr);

    return 0;
}

これにより、 SPARCアーキテクチャーでミスアライメントの例外が発生することはわかっています。しかし、私は一生、x86でそれを行う方法を理解できません。

どうすればいいですか?

4

1 に答える 1

1

アライメント違反を作成するには、EFLAGS で AC フラグを設定する必要があります。それはビット 18 です。

アセンブリでこれを行う簡単な方法は次のとおりです。

pushf       ; Push the flags onto the stack
pop eax     ; Pop the pushed flags into EAX
bts eax, 18 ; Set bit 18 in EAX (note, this might not work. You may need to do "mov ebx, 18; bts eax ebx")
push eax    ; Push that back onto the stack
popf        ; Pop eflags from the stack

ショートの短さにもよりますが、ショートでこれを行うことができるかどうかはわかりません。とにかく8ビット未満にはアクセスできないため、8ビットアクセスは常に整列されます。念のため、int を使用してみてください。

于 2013-05-02T23:43:32.900 に答える