Branching in SHx Inline Assembly

A branch instruction may be given a fixed displacement, or as a jump to a targeted label. If a label is used, the label must be defined within an __asm string in the current function. __asm labels are not visible outside of __asm strings. The __asm label must be isolated in its own __asm block. The distance from a label reference to its definition must fit within the displacement field of the corresponding branch instruction.

Although it is possible to branch between different __asm statements, it is not recommended. This could result in undefined behavior, especially when compiled with optimizing options.

The following example demonstrates how to use displacement branch instructions within __asm statements.

  __asm(
    "sett      ; set T bit\n"
    "bf 6      ; branch to print FAIL if not set\n"
    "jsr @R6   ; print PASS\n"
    "nop       ; delay slot\n"
    "bra 4     ; branch using displacement\n"
    "nop       ; delay slot\n"
    "jsr @R6   ; print PASS\n"
    "nop       ; delay slot\n"
    ,"PASS\n"  // argument #1 (R4)
    ,"FAIL\n"  // argument #2 (R5)
    ,printf    // argument #3 (R6)
  );

The following example demonstrates how to use labels in branch instructions within __asm statements.

#include <stdio.h>

void main()
{
  __asm(
    "sett      ; set T bit\n"
    "bf lab1   ; branch to print FAIL if not set\n"
    "jsr @R5   ; print PASS\n"
    "nop       ; delay slot\n"
    "bra lab2  ; branch using label\n"
    "nop       ; delay slot"
    ,"PASS\n"
    ,printf
    );
  __asm(
    "lab1:     ; isolate label"
    );
  __asm(
    "jsr @R5   ; print FAIL\n"
    "nop       ; delay slot"
    ,"FAIL\n"
    ,printf
    );
  __asm(
    "lab2:"
    );
}

See Also

Elements of the SHx __asm Block | The __asm Keyword in SHx Inline Assembly | __asm Restrictions in SHx Inline Assembly | Constants in SHx Inline Assembly | Symbols and Labels in SHx Inline Assembly | SHx Inline Assembly Parameters | SH-4 Mode Bits

 Last updated on Thursday, April 08, 2004

© 1992-2003 Microsoft Corporation. All rights reserved.