Nach
Delphi-Quellcode:
mov edx,[Params]
add edx,off
Steht in edx ein Zeiger auf einen TVarRec. Folglich steht dann mit movzx ecx,[edx+$04] in ecx vType, wenn du kein mov edx,[edx] davor einfügst.
Mit dem movzx ecx, word ptr [edx+$08] hast du dann allerdings in ecx schon den Anfang des nächsten TVarRec - schließlich zeigt edx auf einen, und SizeOf(TVarRec) ist 8.
Wenn du allerdings davor noch ein mov edx, [edx] einfügst, zeigt edx nicht mehr auf den TVarRec, sondern auf den Extended, und dann stimmt alles. Du solltest das mov edx, [edx] also am besten direkt nach jnz @NoExt einfügen.
Warum deine andere Lösung funktioniert, ist dann auch klar: Du hast zwar das mov edx, [edx] zu früh ausgeführt, aber um dir den vType zu holen, startest du von neuem und ignorierst den falschen Wert von edx. Allerdings wird es dann unangenehm für nicht-Floats.