I'm currently learning about calling conventions on windows, both x64 and x86. As far as I know, calling conventions indicates how you pass the arguments, get the returns value, and who will clean up the stack frame.
Most x86 conventions push the arguments on the stack from right to left (except for __fastcall that uses the eax, ecx, and edx registers), and the return value will go to the eax registry if it's 32 bits or smaller (or the edx:eax pair if it's 64 bits). If the return value is greater than 64 bits, then the caller would need to pass in a hidden pointer that the callee will fill the result in. Most of the time, the callee cleans up the stack (except for __cdecl).
The x64 calling convention looks like __fastcall that works with 64-bit registers. My question is, after reading through this page, it says that: the rax, rcx, rdx, and r8-r11 are volatile, while the rbx, rbp, rdi, rsi, and r12-r15 are nonvolatile. What does volatile means in this case? Also, am I understanding the idea of calling convention correctly?