Assembly FASM按引用/指针传递
我正在尝试编写一个汇编函数,用于分配内存并将地址存储在给定指针中。但是,我不知道如何在传递给函数的参数中存储地址 我有以下资料:Assembly FASM按引用/指针传递,assembly,fasm,Assembly,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 .ty
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
有什么想法吗?您不能将新指针存储在
重新分配内存中,因为您在该例程中没有它的地址
或者
- 修改该例程以获取指向变量的指针(使用
leaeax,SockArray获取并传递地址;按下eax
或类似命令),然后加载参数并使用例如mov-edx、[ebp+0x10]
然后mov[edx],eax
存储到该参数李>
或者,这更简单:
- 不要试图将新指针存储在
重新分配内存中。因为它是在eax
中返回的,所以您可以简单地将它存储在调用范围中,就像在malloc
调用之后一样
旁白:加载带有值的edx
,然后调用函数(free
)是危险的:不需要子程序来保留edx
的值。最好不要在free
返回之前加载它,即使它当前正在工作。我不太确定我是否了解所有这些,因为我对asm还是相当陌生的。我做到了:而且似乎奏效了。我必须保存edx和其他寄存器,否则它会崩溃。你说得对。你说的话我懂一点,但不是全部。特别是更简单的方法
。我接受这个答案,因为我了解它的大部分内容,并且保存寄存器部分保存了我:请让我看看我是否可以更好地解释它:在重新分配内存
中,您调用malloc
以获取新的缓冲区。malloc
的结果在eax
中返回。如果你只是把它留在那里,不做任何事情就返回给调用者,那么当重新分配内存
返回时,该值仍将在调用范围中,并且你可以用原始malloc
调用进一步存储它,就像你所做的一样(尽管被注释掉了)。哦,我明白了!我没有想到这一点。我一直想让它使用参数来考虑返回值。啊哈。这是一个更好的解释。谢谢D