Looking at the call stack I just noticed this:
Notice the Opt.out
at the top.
Just curious, what does Opt.out
mean?
Here's the snippet that I'm stepping through:
function BinaryEquals(Left, Right: pointer; Size: integer): boolean;
....
{$IFDEF CPUX64}
asm
....
sub r8,4
@loop1:
inc R8
I'm not sure what the mnemonic means, but what the call stack is telling you is that it cannot reliably report the value of the arguments.
Consider this program:
Step into
Foo
. When you do so the call stack looks like this in 32 bit:and this in 64 bit:
Then step over the first line of
Foo
. Now the call stack looks like this for in 32 bit:and this in 64 bit:
What the debugger is telling you is that the arguments arrived in registers. It has no control over what you do with registers once the body of the asm function is executed. And so it declines to attempt to report argument values.
If you switch to the 32 bit compiler, and change calling convention so that the arguments arrive on the stack rather than in registers, then the behaviour is different. In that scenario the debugger feels confident to report argument values because it believes that you are not going to trash the stack.
In 32 bit that is made clear by the using of
???
. Quite why the textOpt.out
is used in 64 bit I don't know, but the meaning of it is clear.