我想在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上做到这一点。
我该怎么做?
答案 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只是为了确定。