2012-04-25 116 views
0

我偶然发现了一个汇编编程挑战,我需要找到为什么下面的代码在尝试运行时出现总线错误。经过大量的谷歌搜索,我仍然无法弄清楚为什么。我对汇编x86的理解不是很好,找到解决方案的任何提示都将非常感激。在汇编内联编程中发生总线错误x86

下面是代码:

#include <stdlib.h> 
int main(void) { 
    asm("pushf\n" 
     "orl $ 0x40000, (%esp)\n" 
     "popf\n"); 

    *((int*) (((char*) malloc(5)) + 1)) = 23; // This line causes the Bus Error 


    return 0; 
} 
+0

这可能有所帮助:http://stackoverflow.com/questions/212466/what-is-a-bus-error – BlackBear 2012-04-25 19:26:57

+0

谢谢,这有很大的帮助。我发现错误:malloc(5)之后的“+1”! – juliensaad 2012-04-25 19:32:16

回答

1

本质上要设置一个标志标志注册。标志0x40000,又名位18根据http://en.wikipedia.org/wiki/FLAGS_register_%28computing%29这是

18 AC对齐检查(486SX +只)X

如果你搜索 “标志对准检查” 你会发现除其他外:

http://forum.soft32.com/linux2/Turn-x86-Alignment-Check-ftopict12003.html

我希望这能让你走上正轨。但你真的有一个486SX?

+0

谢谢,我不知道我是否有486SX,但至少这让我走上了正轨。我会检查有关国旗的信息。 – juliensaad 2012-04-25 19:48:15

+0

请注意,标志寄存器的对齐检查位似乎是一个非常酷的想法,并且可以帮助您捕获并修复程序中不可移植的未对齐访问,而无需在更多RISC架构上构建和测试它们。但是,由于x86 abi只有'double'对齐到4个字节而不是8个,所以在大多数浮点代码上会产生伪SIGBUS ... :-(这使得在实践中几乎不可能使用,除非你写一个'SIGBUS'处理程序,检查异常是否是由于浮点加载/存储和解决它... – 2012-04-27 04:20:39

+0

有趣的想法,谢谢。 – 2012-04-27 07:56:09