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 回答