我在看一个学校项目的旧代码,在试图在我的笔记本电脑上编译时遇到了一些问题它最初是为旧的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/