2014-04-20 142 views
0

我試圖寫分配的存儲器,存儲在給定的指針的地址的組件的功能。但是,我不知道如何將地址存儲在傳遞給函數的參數中。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 

任何想法?

回答

1

不能在新指針存儲在ReAllocate_Memory,因爲你沒有擁有它是常規內的地址。

要麼

  • 修改例程採取的指針變量(獲取和與lea eax, SockArray; push eax或類似傳遞的地址),然後加載參數,並存儲到它與例如mov edx, [ebp + 0x10]然後mov [edx], eax

不然,這是比較容易的方式:

  • 不要嘗試新的指針存儲在ReAllocate_Memory。由於它是在eax返回,你可以簡單地存儲在呼叫範圍內,和你一樣的malloc通話後做。

旁白:裝載edx有一個值,然後調用一個函數(free)是危險的:子例程不需要保留的edx值。最好不要在free返回之後加載,即使它發生在當前工作。

+0

,我也不太清楚,我明白了這一切,因爲我是相當新在彙編依然。我做了:http://pastebin.com/fYUXBkeW,它似乎工作。我不得不保存'edx'和其他寄存器,否則會崩潰。你對此是正確的。我理解你的意思,但不是全部。特別是'更簡單的方法'。我接受這個答案是因爲我明白了它的大部分,並且保存寄存器部分保存了我:D – Brandon

+1

讓我看看我能否更好地解釋它:在'ReAllocate_Memory'中爲新緩衝區調用'malloc'。 'malloc'的結果在'eax'中返回。如果你把它留在那裏並且不做任何事情就返回給調用者,當'ReAllocate_Memory'返回時,這個值仍然會在調用範圍中,並且你可以像原來一樣將它存儲起來(雖然註釋掉了) '再打電話。 –

+0

OHHH我明白了!我沒有想到這一點。我的思想堅持讓它使用參數來思考返回值。 Ahaha。這是一個更好的解釋。謝謝! :d – Brandon