【问题标题】:Getting a bus error in Assembly in-line programming x86在汇编内联编程 x86 中出现总线错误
【发布时间】:2012-04-26 03:41:54
【问题描述】:

我偶然发现了一个汇编编程挑战,我需要找出为什么以下代码在尝试运行它时会出现总线错误。经过多次谷歌搜索,我仍然无法弄清楚为什么..我对汇编 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;
}

【问题讨论】:

标签: assembly x86 bus


【解决方案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 吗?

【讨论】:

  • 谢谢,我不知道我是否有 486SX,但至少这让我走上了正轨。我会检查有关旗帜的信息。
  • 请注意,标志寄存器的对齐检查位似乎是一个非常酷的想法,它可以帮助您在程序中捕获和修复不可移植的未对齐访问,而无需在更多 RISCy 架构上构建和测试它们。但是,由于 x86 abi 仅将 doubles 对齐到 4 个字节而不是 8 个字节,因此它会在大多数浮点代码上导致虚假的 SIGBUS... :-( 这使得它几乎不可能在实践中使用,除非您编写一个SIGBUS 处理程序来检查异常是否是由于浮点加载/存储并解决它...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-23
  • 1970-01-01
  • 2023-03-07
  • 1970-01-01
  • 2017-05-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多