FASM проходит по ссылке/указателю

Я пытаюсь написать функцию сборки, которая выделяет память и сохраняет адрес в заданном указателе. Однако я не могу понять, как сохранить адрес в параметре, переданном функции.

У меня есть следующее:

struc SSLSocket sock, ssl, ctx, address, port, connected, type
{
   .sock dd sock
   .ssl dd ssl
   .ctx dd ctx
   .address dd address
   .port dw port
   .connected db connected
   .type dd type
}

SockArray dd 0  //will allocate 5 of the above struct on the heap and store it in this pointer.

section '.code' code readable executable
main:
   push ebp
   mov ebp,esp


   ;push 5
   ;call [malloc]
   ;add esp, 0x04
   ;mov [SockArray], eax

   push SockArray   ;pointer that will hold allocated memory
   push 23         ;size of struct
   call ReAllocate_Memory
   add esp, 0x08

   push [SockArray] //print address of allocated memory.
   push PrintPtr
   call [printf]
   add esp, 0x08


   mov esp, ebp
   pop ebx

   call [getchar]

   mov eax, 0x00
ret

ReAllocate_Memory:
   push ebp
   mov ebp, esp

   mov eax, [ebp + 0x0C]      ;Pointer that will hold address of allocation
   mov edx, [ebp + 0x08]      ;Size to allocate in bytes

   push eax
   call [free]                ;Free any allocated memory
   add esp, 0x04

   push edx
   call [malloc]              ;Allocate n-size bytes
   add esp, 0x04

   ;mov address into parameter pointer ([ebp + 0x0C]).

   mov esp, ebp
   pop ebp
ret

Любые идеи?


person Brandon    schedule 20.04.2014    source источник


Ответы (1)


Вы не можете сохранить новый указатель в ReAllocate_Memory, поскольку у вас нет его адреса в этой подпрограмме.

Либо

  • измените эту процедуру, чтобы взять указатель на переменную (получить и передать адрес с помощью lea eax, SockArray; push eax или аналогичного), а затем загрузить параметр и сохранить его, например. mov edx, [ebp + 0x10], затем mov [edx], eax.

или иначе, и это намного проще:

  • не пытайтесь сохранить новый указатель в ReAllocate_Memory. Поскольку он возвращается в eax, вы можете просто сохранить его в вызывающей области, как и после вызова malloc.

В стороне: загрузка edx со значением, а затем вызов функции (free) опасна: подпрограммы не требуются для сохранения значения edx. Лучше не загружать его до тех пор, пока не вернется free, даже если в данный момент он работает.

person 500 - Internal Server Error    schedule 20.04.2014
comment
Я не слишком уверен, что понимаю все это, так как я еще новичок в asm. Я сделал: pastebin.com/fYUXBkeW, и, похоже, это работает. Мне пришлось сохранить edx и другие регистры, потому что иначе произошел бы сбой. Вы были правы в этом. Я немного понял из того, что вы сказали, но не все. В частности, easier way. Я принимаю этот ответ, потому что я понимаю большую его часть, и части регистра сохранения спасли меня: D - person Brandon; 20.04.2014
comment
Позвольте мне посмотреть, смогу ли я объяснить это лучше: в ReAllocate_Memory вы вызываете malloc для нового буфера. Результат из malloc возвращается в eax. Если вы просто оставите его там и вернетесь к вызывающей стороне, ничего не делая, значение все еще будет в области вызова, когда ReAllocate_Memory вернется, и вы можете сохранить его так же, как и вы (хотя и закомментированный) с исходным вызовом malloc выше. . - person 500 - Internal Server Error; 20.04.2014
comment
ОХХ Я вижу! Я не думал об этом. Я зациклился на том, чтобы заставить его работать с параметрами, чтобы думать о возвращаемом значении. Ахаха. Это было гораздо лучшее объяснение. Благодарю вас! :D - person Brandon; 20.04.2014