Forum > Beginners


(1/2) > >>


To call getMem from assembly there has been made a separate function: asmgetmem since assembler can not decide on overloaded functions. Trying to call this function ends up with unknown function. What has happen with this? Tried to call also getmem from assembler, but as expected this ended with an exception.

call system.@asmgetmem


What FPC version are you using? AsmGetMem/AsmFreeMem doesn't exist in recent release.

I am using fpc 2.6.4. I suspected that these functions had disapeared, any workaround?


You can export a symbol accessible from asm using public name modifier, wrapping one of the overloaded GetMem, probably with a simpler calling convention specifier for easier access (unless you understand the register calling convention).

I'm not sure how to use 'public name', how could it be implemented in this case?

I made a short pascal program to test the assembler result and to check result of the two overloded routines GetMem. I also for the fun retrieved the address of GetMem. As can be seen there are two different addresses for the two routines. When address is retrieved the address to the first routine is given, but when calling from assembly I like to use the other which has a pointer to allocated memory. Can anyone give me a sample, I guess this issue will be valid for calling other overloaded functions in fpc.

--- Code: ---[code]TFORM1__BUTTON1CLICK
00425DF2 e583                     in     eax,0x83
00425DF4 ec                       in     al,dx
00425DF5 108945f88955             adc    BYTE PTR [ecx+0x5589f845],cl
00425DFB fc                       cld   
00425DFC b880d64000               mov    eax,0x40d680
00425E01 8945f4                   mov    DWORD PTR [ebp-0xc],eax
00425E04 b8e8030000               mov    eax,0x3e8
00425E09 e8c278feff              call   0x40d6d0 <SYSTEM_GETMEM$LONGWORD$$POINTER>
00425E0E 8945f4                   mov    DWORD PTR [ebp-0xc],eax
00425E11 8d45f0                   lea    eax,[ebp-0x10]
00425E14 bae8030000               mov    edx,0x3e8
00425E19 e86278feff               call   0x40d680 <SYSTEM_GETMEM$POINTER$LONGWORD>
00425E1E b8f4010000               mov    eax,0x1f4
00425E23 e8a878feff               call   0x40d6d0 <SYSTEM_GETMEM$LONGWORD$$POINTER>
00425E28 8945f4                   mov    DWORD PTR [ebp-0xc],eax
00425E2B c9                       leave 
00425E2C c3                       ret   

procedure TForm1.Button1Click(Sender: TObject);

var p,pt:pointer;

  p:= @(getmem);  // returning x40d680
  p:= getmem(1000);  // calling x40d6d0
  GetMem(pt,1000);  // calling x40d680
  p:=getmem(500); // calling 0x40d6d0
--- End code ---


[0] Message Index

[#] Next page

Go to full version