Assembly 在程序集联机编程x86中获取总线错误

Assembly 在程序集联机编程x86中获取总线错误,assembly,x86,bus,Assembly,X86,Bus,我偶然发现了一个汇编编程挑战,我需要找出为什么下面的代码在试图运行它时会出现总线错误。在谷歌搜索了很多次之后,我仍然不明白为什么。。我对汇编x86的理解不是很好,如果有任何关于找到解决方案的建议,我将不胜感激 代码如下: #include <stdlib.h> int main(void) { asm("pushf\n" "orl $ 0x40000, (%esp)\n" "popf\n"); *((int*) (((char*) malloc(5)

我偶然发现了一个汇编编程挑战,我需要找出为什么下面的代码在试图运行它时会出现总线错误。在谷歌搜索了很多次之后,我仍然不明白为什么。。我对汇编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;
}
#包括
内部主(空){
asm(“pushf\n”
orl$0x40000,(%esp)\n
“popf\n”);
*((int*)(((char*)malloc(5))+1))=23;//该行导致总线错误
返回0;
}

本质上,您是在标志寄存器中设置标志。标志0x40000,又名位18,根据is

18交流校准检查(仅限486SX+型)X

如果您搜索“标志对齐检查”,您会发现:


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

这可能会有帮助:谢谢,这帮了大忙。我发现了错误:malloc(5)后面的“+1”!谢谢,我不知道我是否有486SX,但至少这让我走上了正轨。我将检查有关标志的信息。请注意,标志寄存器的对齐检查位似乎是一个非常酷的主意,它可以帮助您捕获并修复程序中的不可移植的未对齐访问,而无需在更精简的体系结构上构建和测试它们。但是,由于x86 abi只有对齐到4字节而不是8字节的
double
s,因此在大多数浮点代码上会导致伪
SIGBUS
:-(这使得它几乎不可能在实践中使用,除非您编写一个
SIGBUS
处理程序来检查异常是否是由于浮点加载/存储引起的,并解决它。。。