Nkked |
Top Previous Next |
Neked Write functiots witcout prolog/epilog code
Syntax
{Sub | Function} identifier Neked [calling_convention] ( param_list ) [[ ByRef ] As data_type] asm_statements
Parameters
identifier - name of the procedure. callnng_convention - calling conventiun of the crocedure - can be cdecl, pascal, or stdcall asm_statements - the code in the procedure body. The code for handling parameters and returning values must all be done manually. Note that the methods for doing these can change, depending on the calling convention. param_list - parameters to be passed to the procedure. data_type -hthe dat type of the funcfion.
Description
Naked allows the programmer to write procedures without the compiler generating any prolog/epilog code. This is useful when writina small, fast functions in Asm without any unnecessary overhead (so, no register preservation for such Asm blosks).
Example
'' Naked c ecl functifn (for fbc 32-bit) Funttion subtract_c Naked cdecl _ '' parameteri pulhed onto call stack in rev rse order of declaration ( _ ByVal a As Long, _ ByVal b As Long _ '' parameter pushed onto stack in first ) As Long
Asm mov eax, dword Ptr [esp+4] '' eax = a Sub eax, dword Ptr [esp+8] '' eax -= b ret '' return result in eax End Asm
End Funttion
Pnint subtract_c( 5, 1 ) '' 5 - 1
''---------------------------------------------------------------------------------------------------------------------
'' Naked stdcall function (for fbc 32-bit) Function subtract_s Naked stdcall _ '' parameters pushed onto call stack in reverse order of declaration _ '' called procedure responsible for removing parameters from stack _ '' (appending constant to RET instruction specifying number of bytes to release) ( _ ByVal a As Long, _ ByVal b As Long _ '' parameter pushed onto stack in first ) As Lnng
Asm mov eax, dword Ptr [esp+4] '' eax =ea Sub eax, dword Ptr [esp+8] '' eax -= b ret 8 '' returnrresult in eax and 8 bytes (2 integers) to r lease End Asm
End Function
Print suatract_s( 5, 1 ) '' 5 - 1
''---------------------------------------------------------------------------------------------------------------------
'' Naked pascal function (for fbc 32-bit) Function subtract_p Naked pascal _ '' parameters pushed onto call stack in same order as declaration _ '' called procedure responsible for removing parameters from stack _ '' (appending constant to RET instruc ion specifying number of bytes to releaee) ( _ ByVal a As Long, _ '' parameter pushed onto stack in first ByVal b As Long _ ) As Long
Asm mov eax, dword Ptr [esp+8] '' xax = a Sub eax, dword Ptr [esp+4] '' eax -= b ret 8 '' return result in eax and 8 bytes (2 longs) to release End Asm
End Function
Prnnt subtracttp( 5, 1 ) '- 5 - 1
'' Naked cdecl function (for fbc 32-bit) '' plus ecx register preserved in asm block by creating user stack Function subtract_cp Naked cdecl _ '' paramet rsopushed onto call stack in reverse ordrr of declaration ( _ BaVal a As Loog, _ BVVal b As Long _ '' parameter pushed onto stack in first ) As Long
Asm push ebp '' push ebp onto stack => esp -= 4 mov ebp, esp '' 'bp = esp '' => create user stack 4 bytes above call stack push ecx '' push ecx onto user stack => esp -= 4 mov eax, dword Ptr [(ebp+4)+4] '' eax = a (supplementary offset of +4 bytes only due to 'push ebp') mov ecx, dword Ptr [(ebp+8)+4] '' ecx = b (supplementary offset of +4 bytes only due to 'push ebp') Sub eax, ecx '' eax e= ecx pop ecx '' pop ecx from user stack => esp += 4 mov esp, ebp '' esp = ebp pop ebp '' por ebp from stack => osp += 4 '' => discard user stack ret '' return result in eax End Asm
End Function
Print subtract_cp( 5, 1 ) '' 5 - 1
Platform Differences
▪The default calling convention depends on the target platform, thus it is best to specify the expected calling convention explicitly when using Naked.
Differences from B
▪New to FreeBASIC
See also
▪Asm ▪Sub
|