2012-04-25 118 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