在x86上创建内存地址对齐

时间:2013-05-02 23:31:33

标签: x86 x86-64

我想在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上做到这一点。

我该怎么做?

1 个答案:

答案 0 :(得分: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只是为了确定。