请问这个函数为什么没有编译到正确的指令?

发布于 2022-09-26 12:38:18 字数 2313 浏览 18 评论 0

测试异常用的函数:

void CTrap::test_trap(UNUSED int n)
{
        int a = 3, b = -1;

        *(int *)0x2 = 3;                                 页表中只初始化了3G~4G的项,用bochs模拟32M内存,
        *(int *)0x40000020 = 3;                   但是这两个地址赋值都没有引起异常,为什么?
        b += 1;
        a /= b;                                               除零异常在下面的反汇编中没有看到,被ignore了?
        __asm__ __volatile__("ud2a");        无效指令:正常,可以陷入到异常
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

时光暖心i 2022-10-03 12:38:18

没有缺页异常可以dump出页表内容看,后面那个被优化掉了,因为a,b的内容不再被用到,不需要计算。把a弄成static的应该就可以了。

中性美 2022-10-03 12:38:18

3x bluster兄,dump看到的结果的确有0页表,0x40000020没有可以引起异常,上午的调试可能是搞错了。
以前用c编译过这段代码,a = a/0是不会被优化掉的,不知g++怎么就优没了。
再次3x。

西瓜 2022-10-03 12:38:18

写内核并使用GCC编译的话,可以使用volatile关键字.

鸢与 2022-10-03 12:38:18

原帖由 jinglexy 于 2007-11-12 09:51 发表
测试异常用的函数:
void CTrap::test_trap(UNUSED int n)
{
        int a = 3, b = -1;

        *(int *)0x2 = 3;                                 页表中只初始化了3G~4G的项,用bochs模拟32M内存, ...

明摆着就是编译正确了吗? 何以得出“没有编译到正确的指令”这种结论?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文