This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

How to prevent OT 8 from generating an LJMP

If Optimize 8 (Reuse Common Entry Code) detects void MyFunc() as the last statement within void OuterFunc() (for example), it will produce an LJMP to MyFunc() rather than an LCALL. (see examples)

Nice optimization, but MyFunc() is part of a library written in assembly and by design reuqires a call rather than a jump. I tried surrounding its prototype with a #pragma OT (7), but that doesn't work. Surrounding OuterFunc() with the OT (7) pragma works, but that's a bit cumbersome and runs the risk of someone forgetting to do it.

void OuterFunc( void )
{
   MyFunc();   // Compiler generates LJMP.  Not good :o(
}


#pragma OT (7)
void OuterFunc( void )
{
   MyFunc();   // Compiler now generates the necessary
               // LCALL, but programmers WILL forget to use
               // this construct and will blow the whistle
               // when their software bombs.
}
#pragma OT (8)

Parents
  • Jay,

    I think you understand exactly what I'm trying to accomplish and, as you stated, I found the solution quite some time ago. The technique is identical to the old _chain( old_vector ) that was available in DOS programming and is necessary when you have more than one interrupt handler servicing the same interrupt line ( EX0, for example) and the ISRs have to be chained in order route service to the appropriate area.

    I won't even dare discuss my interrupt scheme. Can you imagine the tangent that would invoke ???

    How we got off on some ridiculous tangent like he feared

    hmmmm...does this mean I'm Edgar Casey ???

    Anyway, I thank everyone who actually contributed ideas to my question.

Reply
  • Jay,

    I think you understand exactly what I'm trying to accomplish and, as you stated, I found the solution quite some time ago. The technique is identical to the old _chain( old_vector ) that was available in DOS programming and is necessary when you have more than one interrupt handler servicing the same interrupt line ( EX0, for example) and the ISRs have to be chained in order route service to the appropriate area.

    I won't even dare discuss my interrupt scheme. Can you imagine the tangent that would invoke ???

    How we got off on some ridiculous tangent like he feared

    hmmmm...does this mean I'm Edgar Casey ???

    Anyway, I thank everyone who actually contributed ideas to my question.

Children
No data