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. 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. edi is identical to 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.