• SergP © (12.06.17 10:06) [0]
    Объясните некоторые моменты по работе этой функции.

    Вот эта функция в том виде в котором она присутствует в grids.pas

    function StackAlloc(Size: Integer): Pointer; register;
    asm
     POP   ECX          { return address }
     MOV   EDX, ESP
     ADD   EAX, 3
     AND   EAX, not 3   // round up to keep ESP dword aligned
     CMP   EAX, 4092
     JLE   @@2
    @@1:
     SUB   ESP, 4092
     PUSH  EAX          { make sure we touch guard page, to grow stack }
     SUB   EAX, 4096
     JNS   @@1
     ADD   EAX, 4096
    @@2:
     SUB   ESP, EAX
     MOV   EAX, ESP     { function result = low memory address of block }
     PUSH  EDX          { save original SP, for cleanup }
     MOV   EDX, ESP
     SUB   EDX, 4
     PUSH  EDX          { save current SP, for sanity check  (sp = [sp]) }
     PUSH  ECX          { return to caller }
    end;



    Ну что касается выравнивания - то это понятно.
    А вот что делается дальше и для чего?
    Имеется ввиду для чего указатель стека уменьшается не сразу на нужную величину, а кусками по 4k и в каждой такой итерации в стек пихается EAX, и судя по всему это впихнутое значение в стеке никому никогда не будет не нужно.
  • Sha © (12.06.17 10:31) [1]
  • SergP © (12.06.17 11:23) [2]
    Ага. Вот оно как, оказывается... Понял. Спасибо...
  • Rouse_ © (12.06.17 19:45) [3]
    Конечно, не в плане пиара, но чтобы понять как там все в памяти приложения фунциклирует, я давно накатал вот такую чтуку: https://github.com/AlexanderBagel/ProcessMemoryMap
    Скоро перейдет в разряд беты, как допилю один из требуемых мне функционалов
Есть новые Нет новых   [118607   +37][b:0][p:0.001]