assembly - 如何在中断服务程序中将寄存器保存在x86_64上?

标签 assembly x86-64 isr

我在看一个学校项目的旧代码,在试图在我的笔记本电脑上编译时遇到了一些问题它最初是为旧的32位gcc版本编写的。无论如何,我试图将一些程序集转换为64位兼容代码,但遇到了一些问题。
这是原始代码:

pusha
pushl   %ds
pushl   %es
pushl   %fs
pushl   %gs
pushl   %ss

pusha在64位模式下无效。那么,在64位模式下,在x86_64程序集中执行此操作的正确方法是什么?
在64位模式下pusha无效肯定有原因,所以我觉得手动推送所有寄存器可能不是个好主意。

最佳答案

从现有的代码学习这样的事情。例如:
Linux(搜索SAVE_ARGS_IRQ):entry_64.S
OpenSolaris(搜索INTR_PUSH):privregs.h
FreeBSD(搜索IDT_VEC):exception.S(类似于NetBSD中的vector.S
事实上,“手动推送”RESS是AMD64上唯一的方法,因为“CC”不存在。AMD64在这方面不是唯一的——大多数非x86 CPU在某些时候确实需要逐寄存器保存/恢复。
但如果仔细检查引用的源代码,您会发现并非所有的中断处理程序都需要保存/还原整个寄存器集,因此存在优化的空间。

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

相关文章:

compiler-construction - 以哪个汇编程序为目标?

python - 创建中断 (ISR) 以创建平滑的机械臂运动

assembly - 如何确定寄存器是从右向左加载还是从右向左加载

c - 确定进行缓冲区溢出攻击所需的额外字节数(作业)

assembly - C64 上的稳定光栅

pointers - 为什么 RBP 而不是另一个寄存器作为帧指针?

linux - 在现代 Linux x86-64 中,用户空间覆盖 GS 寄存器是否安全?

assembly - 如何将字符串的第一个字符与 x86-64 汇编中的另一个字符进行比较?

裸机可移植库中的 C99 "atomic"加载