Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly FASM按引用/指针传递_Assembly_Fasm - Fatal编程技术网

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