A register frame procedure does not maintain a call frame on the stack and must therefore save its caller's context in registers. This type of procedure is sometimes referred to as a lightweight procedure, referring to the relatively fast way of saving the call context.
Such a procedure cannot save and restore nonscratch registers. Because a procedure without a stack frame must therefore use scratch registers to maintain the caller's context, such a procedure cannot make a standard call to any other procedure.
A procedure with a register frame can have an exception handler and can handle exceptions in the normal way. Such a procedure can also allocate local stack storage in the normal way, although it will not necessarily do so.
Note Lightweight procedures have more freedom than might be apparent. By use of appropriate agreements with callers of the lightweight procedure, with procedures that the lightweight procedure calls, and by the use of unwind handlers, a lightweight procedure may modify nonscratch registers, and may call other procedures.
Such agreements may be by convention (as in the case of language support routines in the RTL) or by interprocedural analysis. Calls employing such agreements are, however, not standard calls, and might not be fully supported by a debugger since, for instance, it might not be able to find the contents of the preserved registers.
Since such agreements must be permanent (for upward compatibility of object code), lightweight procedures should in general follow the normal restrictions.