Thank you dreamCoder and Frank for replying so quickly!
And thank you for the Virtual Address information.
I am guessing that one of the instructions from my original post...
mov dword eax,[0x00010000]
...is not actually looking at the physical memory address location of 0x00010000 but instead is looking at a virtual memory address location which could be almost anywhere in physical memory.
So based on what you said...
#GP is basically triggered by the CPU for various memory-related reasons, most likely by an unmapped virtual memory reference being requested by an application. But the OS can also disguise somewhere in there via one of its exception handlers. It could be your absolute addressing mode pointing to a protected/privileged memory area (writeable, executable, readable etc), or simply referencing a memory out of the allocated range / pages.
This changes the meaning of the segment registers to a "selector" - an index into a "descriptor table". We have to have a descriptor table loaded before doing this. A descriptor includes some bits that control access rights... but this is probably not where access is controlled. We can set another bit - I think it's bit 31- which enables virtual memory. Another control register (as I recall) points to a "page directory" which points to "page tables" which control the mapping of virtual memory to physical memory. Virtual memory is what we access in protected mode.
... it looks like I have a lot more to learn about Virtual Memory in Protected Mode.
Thank you both again for your quick and thorough replies!
If/When I have the time in the future, I will find more information about selectors, the descriptor table, the page directory, page tables, etc. and when I understand Virtual Memory fully, I will reply to this thread with either a understandable breakdown of how protected memory works, or links to understandable breakdowns that I think will be helpful for other beginner programmers that want to learn about Virtual Memory in Protected Mode.
-Frankly