C Inline Assembly

From llvm-mos
Jump to navigation Jump to search

Clang supports most of the standard GCC inline assembly syntax. There are a few notable exceptions:

  • Unsupported Constraints: o, V, <, >, and g
  • Goto Labels are unsupported.

"General purpose registers" for the purposes of inline assembly are taken to be 8-bit or 16-bit imaginary registers, depending on the size of the operand.

The compiler also supports a few MOS-specific constraints:

  • a: The A register.
  • x: The X register.
  • y: The Y register.
  • R: One of A, X, or Y.
  • d: Either X or Y.

The unique opcode syntax of the 6502 allows using these operands in unorthodox ways. For example, to issue a copy from a d constrained operand to A, you can use the following:

asm volatile ("t%0a" :: "d"(c));

This will issue either txa or tya, depending on where the compiler places c.