2015-06-24 12 views
6

auf dem Stapel Aufruf der Suche Ich habe gerade bemerkt dies:Was bedeutet Opt.out?

enter image description here

Beachten Sie die Opt.out an der Spitze.

Einfach nur neugierig, was bedeutet Opt.out?

Hier ist der Code-Schnipsel, die ich durch bin Schritt:

function BinaryEquals(Left, Right: pointer; Size: integer): boolean; 
.... 
{$IFDEF CPUX64} 
asm 
.... 
    sub r8,4 
@loop1: 
    inc R8 
+2

"Optimiert"? –

+0

@Uli Das ist wahrscheinlich auf das Geld. In dem Beispiel in der Frage sind die Argumente aus anderen Gründen als dem Optimierer nicht verfügbar. Im Allgemeinen ist der Optimierer jedoch wahrscheinlich die häufigste Ursache für nicht verfügbare Argumente. Wahrscheinlich sahen die Debugger-Entwickler keine Notwendigkeit genauer zu sein. –

Antwort

7

Ich bin mir nicht sicher, was die mnemonic bedeutet, aber was der Call-Stack ist Ihnen zu sagen ist, dass es nicht zuverlässig den Wert des Berichts kann Argumente.

Betrachten Sie dieses Programm:

procedure Foo(Bar: Pointer); 
asm 
    xor eax,eax 
end; 

begin 
    Foo(nil); 
end. 

Schritt in Foo. Wenn Sie das tun, so sieht der Call-Stack, wie dies in 32-Bit-:

 
Project1.Foo(nil) 
Project1.Project1 
:76f5337a kernel32.BaseThreadInitThunk + 0x12 
:775b92e2 ntdll.RtlInitializeExceptionChain + 0x63 
:775b92b5 ntdll.RtlInitializeExceptionChain + 0x36 

und diese in 64-Bit-:

 
Project1.Foo(nil) 
Project1.Project1 
:00000000772959CD ; C:\Windows\system32\kernel32.dll 
:00000000773CB981 ; ntdll.dll 

Dann über die erste Zeile des Foo Schritt. Jetzt sieht der Call-Stack wie dies in 32 Bit:

 
Project1.Foo(???) 
Project1.Project1 
:76f5337a kernel32.BaseThreadInitThunk + 0x12 
:775b92e2 ntdll.RtlInitializeExceptionChain + 0x63 
:775b92b5 ntdll.RtlInitializeExceptionChain + 0x36 

und diese in 64-Bit-:

 
Project1.Foo(Opt.out) 
Project1.Project1 
:00000000772959CD ; C:\Windows\system32\kernel32.dll 
:00000000773CB981 ; ntdll.dll 

Was der Debugger sagt Ihnen ist, dass die Argumente in den Registern angekommen. Es hat keine Kontrolle darüber, was Sie mit den Registern tun, sobald der Rumpf der asm-Funktion ausgeführt wird. Daher lehnt es ab, Argumentwerte zu melden.

Wenn Sie zum 32-Bit-Compiler wechseln und die Aufrufkonvention so ändern, dass die Argumente nicht auf Registern, sondern auf dem Stack ankommen, ist das Verhalten anders. In diesem Szenario ist der Debugger zuversichtlich, Argumentwerte zu melden, da er der Ansicht ist, dass Sie den Stack nicht löschen.

In 32 Bit, die durch die Verwendung von ??? klar gemacht wird. Ziemlich warum der Text in 64 Bit verwendet wird, weiß ich nicht, aber die Bedeutung davon ist klar.