Eine weitere Erkenntnis:
Der Aufruf von New springt nach GETMEM.INC und zwar in diese Routine:
Delphi-Quellcode:
function SysGetMem(Size: NativeInt): Pointer;
asm
{$ifdef CPU386}
{---------------32-bit BASM SysGetMem---------------}
{On entry:
eax = ASize}
{Since most allocations are for small blocks, determine the small block type
index so long}
lea edx, [eax + BlockHeaderSize - 1]
shr edx, 3
{Is it a small block?}
cmp eax, (MaximumSmallBlockSize - BlockHeaderSize)
Im Falle des funktionierenden Testprogramms wird nach der lea edx... Zeile shr edx, 3 ausgeführt.
Im Falle des nicht funktionierenden Programms, springt lea zurück nach
function _GetMem(Size: NativeInt): Pointer; von wo aus mal MemoryManager.GetMem aufgerufen
worden war.
Also Frage: was veranlasst lea zurück zu springen, anstatt weiter zu laufen.
Im funktionierenden Testprogramm ist [eax + BlockHeaderSize - 1] = 13 und im anderen
ist eax = 10 und BlockheaderSize = 4, was ja genau das selbe ist. Wir können nur edx da nicht mehr
prüfen, da dann schon der Sprung erfolgt ist.
Grüße
TurboMagic