[fpc-pascal] find return adress of a procedure/function

Sven Barth pascaldragon at googlemail.com
Sun Apr 24 20:11:36 CEST 2011


On 24.04.2011 13:49, Rainer Stratmann wrote:
> Am Sunday 24 April 2011 12:45:50 schrieb Sven Barth:
>> On 24.04.2011 12:14, Rainer Stratmann wrote:
>>> Am Sunday 24 April 2011 11:44:18 schrieb Rainer Stratmann:
>>>> How to find the return adress of the calling code of a
>>>> procedure/function?
>>>>
>>>> Where in the stack is the information to the return adress?
>>>>
>>>> stack + - x?
>>>
>>> asm
>>>    mov eax , [ ebp + 4 ]
>>> end;
>>>
>>> eax is the return adress
>>
>> This will only work on i386 and might even work only with certain
>> calling conventions (don't know exactly whether other calling
>> conventions on i386 don't use EAX for the result value).
>>
>>>> How to acess to the information in assembler?
>>>> Is it in every processor architecture possible, for example ARM?
>>>> (actually 80x86).
>>>> Is it different in 32 / 64 bit?
>>
>> Why don't you try this:
>> http://www.freepascal.org/docs-html/rtl/system/get_caller_addr.html
>
> Because I didn't know before :-)
>

A good reason :P

> function get_caller_addr( framebp : pointer ) : pointer;
>
> What does framepb mean?

The usual usage in the sources of the RTL is 
"get_caller_addr(get_frame)" (get_frame is linked in the document I 
linked to in the last mail). Get_frame returns the frame address of the 
current function/procedure/method. Thus "get_caller_addr(get_frame)" 
will return the return address to the calling function.

Regards,
Sven



More information about the fpc-pascal mailing list