【发布时间】:2021-11-23 21:38:46
【问题描述】:
在MASM中使用汇编x86_64,有一些寄存器的值在使用前必须保存;它们必须被推入堆栈。它们是:RBP、RBX、RSP、R12、R13、R14 和 R15。 以RBX为例,为什么要保存?
直接使用它而不保存它会有什么后果?
如果有后果,它会影响我当前正在运行的程序还是会影响其他东西?
寄存器是否在汇编之外使用?意思是 CPU 使用这些寄存器而无需用户在汇编中进行任何操作,或者例如当用户启动程序(视频游戏或其他)或正在使用进程时?
【问题讨论】:
-
任何编译的程序都会使用寄存器。如果您的函数在程序中被调用,那么调用者可能希望您保留这些寄存器。在返回它们的代码时更改它们,当它们假定另一个值已被保留时,您可能会导致错误。保留寄存器的确切选择有些随意,它只是商定的调用约定的一部分。如果您编写自己的函数并从代码中调用它们,而不是其他代码,那么您可以发明任何您喜欢的调用约定。
-
看这里:stackoverflow.com/a/56178078/421195 和这里:developer.arm.com/documentation/ihi0042/latest
A subroutine must preserve the contents of the registers r4-r8, r10, r11 and SP (and r9 in PCS variants that designate r9 as v6) -
寄存器是否在汇编之外使用? - 一切 都是汇编语言(或真正的机器代码)。包括编译器生成的代码。在多任务操作系统下,CPU 寄存器对每个线程都是私有的;操作系统的上下文切换有效地将它们虚拟化。
-
@learn123456 不。每个程序都有自己的一组寄存器。但是您程序中的其他函数可能期望当它们调用您的某个函数时,您的函数将保留
rbx。 -
不,我的意思是 software 线程。就像我在回答中所说的那样,通过操作系统的上下文切换保存/恢复或注册会虚拟化架构寄存器,因此每个软件线程都可以拥有自己的,无论它运行在哪个逻辑核心上。
标签: assembly x86-64 cpu-registers calling-convention