原文链接:https://www.techopedia.com/definition/8591/non-volatile-register
What Does Non-Volatile Register Mean?
A non-volatile register is a type of register witth contents that must be preserved over subroutine calls. Whenever the value of a nonvolatile register is changed by the routine, the old value has to be saved on the stack prior to changing the register and that value has to be restored before returning. A register is similar to a variable, except that there is a fixed number of registers. Every register is a unique location in the CPU in which a single value is saved. A register is the one and only place where mathematical functions, such as addition, multiplication, subtraction, etc., can be carried out. Registers often hold pointers that refer to the memory. Moving values between memory and registers is a common phenomenon.
Techopedia Explains Non-Volatile Register
The following are a few examples of non-volatile registers:
ebx
: A non-volatile register used for general purposes. It is usually set to a common value all through a function to accelerate the calculations.esi
: A non-volatile register used for general purposes. It is commonly used as a pointer, especially for “rep-” class instructions that require a source and destination for data. Here, the esi points to the source. An esi generally holds data that is used all through a function as it is not prone to changes.edi
: Another non-volatile register used for general purposes. This is commonly used as a pointer. An edi is identical to an esi, with the exception that it usually points to the destination.ebp
: Another non-volatile register that is used as a general purpose register. It has two distinctive uses based on the compile settings. It is either a general purpose register or a frame pointer. If the compilation has not been optimized or if the code is hand written, ebp monitors the location of the stack when a function begins. Since the stack is changed all through a function, when ebp is set at the original value, the variables saved on the stack are allowed to be referenced easily. If compilation has been optimized, ebp will be used as a general purpose register to store any type of data, while the calculations for the stack pointer are carried out depending on its movement.
Volatile Register
In other words volatile registers are caller saved registers, as opposed to callee saved. See https://docs.microsoft.com/en-us/cpp/build/x64-calling-convention?view=vs-2019#callercallee-saved-registers
Volatile keyword in C/C++
volatile
means that the value of the variable can be changed by something which is not visible for the compiler. That means that the variable has to have a valid memory representation, it has to be read before any use, and stored if changed.
volatile
keyword should be used always when modification of variable can be asynchronous such as registers in CPU.
Example would be that you are using microcontroller and you are waiting flag when button is pressed. Then you are reading register like this:
uint8_t* reg = 0x12345678; //Register address
while (*reg & 0x02) { //Read register until 0 = button pressed
}
This can easily fail since compiler will check it once and later will ignore value and you may end in infinite loop or you don’t even get anything since CPU can cache value of reg because it assumes noone can modify value where it points to.
If you do this:
volatile uint8_t* reg = 0x12345678; //Register address
while (*reg & 0x02) { //Read register until 0 = button pressed
}
You force compiler to do read instruction from actual memory before it uses content of variable. There is no cache in this case.