I read a long catalog of very good articles on Windows x64 ABI. A very minor aspect of these articles is the description of the frame pointer. The general point is that since the rules of the Windows x64 call stack are so strict, a special frame pointer is usually not needed, although it is optional.
The only exception that I have constantly noted is when alloca() used to dynamically allocate memory on the stack. To perform functions, obviously, a frame pointer is required. For example, to quote from the Microsoft documentation on "Stack Allocation" (italics and highlighted by me):
If space is allocated dynamically (alloca) in a function, then a non-volatile register should be used as the frame pointer to mark the base of the fixed part stack and this register should be saved and initialized in the prolog. Note that when using alloca, calls to the same called party from the same caller can have different home addresses for their register settings.
For this, the Microsoft x64 ABI alloca() documentation smoothly adds:
_alloca is required for 16-byte alignment, and an optional frame pointer is required.
First of all, why should it be used? I assume that an exception is thrown for the call stack, but I have not yet found a satisfactory explanation.
The next question is: where should it indicate? The first of the two quotes above says that "should" be used to denote the base " fixed part of the stack." What is the "fixed portion of the stack"? I get the impression that this term means in this frame a range of addresses that contains (higher addresses for lower ones):
- Caller’s return address (if you consider it to be part of the current function frame);
- addresses to which non-volatile registers were saved using the prolog function; and
- addresses where local variables are stored.
Again, I did not find a satisfactory definition for this "fixed part". The Stack Allocation page that I linked to above contains the diagram below along with the words "if used, the stack pointer will usually point here":

This very wonderful blog post is equally vague, including a diagram in which the frame pointer "points somewhere here", where "here" are addresses for stored non-volatile registers and local users.
The final bit of criticism comes from a Microsoft MSDN article entitled "Dynamic Structure of the Parameter Stack Area" , which contains only this:
If a frame pointer is used, there is an option to dynamically create an area of the parameter stack. This is not currently running on the x64 compiler.
What does "generally" mean? Where is "somewhere here"? Which option is there? Is there a rule? Who cares?
Or, tl; dr: What the name asks. Any response containing an annotated assembly is gratefully accepted.