VAX Assembly question

Rick Murphy rick at rickmurphy.net
Fri Jan 19 05:50:00 CST 2007


At 02:19 AM 1/19/2007, Sean Conner wrote:

>   My question is about the condition handler.  In the text, it's 
> described
>as:
>
>         A longword condition handler address.  Here, the calling routine
>         may store the address of an error-handling routine to be 
> called if
>         an exceptional error condition arises in the procedure.
>
>   This is the only section (as far as I can tell) where this is 
> described,
>and I'm curious as to how exactly it worked.  It appears that while 
>the CPU
>may set this location to 0, its purpose isn't really dictated by the
>hardware, but it a convention used by VMS.  But then (as I was typing 
>this),
>I was struct by this bit:
>
>         ... the calling routine may store ...
>
>   Huh?  How?

The calling routine can store a condition handler in *it's own* stack 
frame prior to a call. Any exceptions that occur in the called routine 
are first handled by the called routine's condition handler (if there 
is one) and are then passed down if necessary to the caller's condition 
handler.
The caller can not set the called routine's condition handler (by 
convention that would be wrong as it breaks the nesting (handlers 
called top-to-bottom). More importantly, the CALL* instruction would 
overwrite the stack location that contains the called routine's handler 
with a zero.

How this is very frequently used in VMS code is for message printing; 
you enable a condition handler in the main function that decodes the 
arguments and prints a message. Upper layers just signal() a condition 
and let the lower layers decide what to do with it, with the default 
being the  main function's message printer. An intermediate function 
that expects a possible exception can enable their own handler to 
suppress errors that they're expecting.
         -Rick




More information about the cctech mailing list