gpt4 book ai didi

assembly - 如何为中断服务例程保存 x86_64 上的寄存器?

转载 作者:行者123 更新时间:2023-12-02 12:16:27 25 4
gpt4 key购买 nike

我正在查看学校项目中的一些旧代码,并在尝试在我的笔记本电脑上编译它时遇到了一些问题。它最初是为旧的 32 位版本的 gcc 编写的。无论如何,我试图将某些程序集转换为 64 位兼容代码并遇到了一些障碍。

这是原始代码:

pusha
pushl %ds
pushl %es
pushl %fs
pushl %gs
pushl %ss
pusha在 64 位模式下无效。那么在 64 位模式下,在 x86_64 汇编中执行此操作的正确方法是什么?

一定有原因 pusha在 64 位模式下无效,所以我感觉手动推送所有寄存器可能不是一个好主意。

最佳答案

从执行此类操作的现有代码中学习。例如:

  • Linux(搜索 SAVE_ARGS_IRQ):entry_64.S
  • OpenSolaris(搜索 INTR_PUSH):privregs.h
  • FreeBSD(搜索 IDT_VEC):exception.S (类似于 NetBSD 中的 vector.S)

  • 事实上,自 PUSHA 以来,“手动推送”regs 是 AMD64 上的唯一方法。那里不存在。 AMD64 在这方面并不是独一无二的——大多数非 x86 CPU 在某些时候也需要逐个寄存器的保存/恢复。

    但是,如果您仔细检查引用的源代码,您会发现并非所有中断处理程序都需要保存/恢复整个寄存器集,因此存在优化空间。

    关于assembly - 如何为中断服务例程保存 x86_64 上的寄存器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6837392/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com