Format strings have a rule that positional arguments ({3}) must appear before named arguments ({foo}) in the argument list of the macro.

However in asm it is quite common to have operands that are in a fixed register (e.g. eax) and don't actually appear in the asm string itself. This can happen when performing a syscall or a function call.

(i.e. there's no name = in front of it)

I see what you mean now.

Option 1 seems best then

I think it'd be acceptable to allow positional arguments that are explicit registers to not appear in the format string, as long as they're the only positional arguments. Mixing implicit arguments with explicit arguments where both are positional seems problematic and error-prone.

That's certainly simpler in implementation, and we can always relax that restriction later.

I do suspect it might prove slightly onerous, or perhaps just hard to explain.

Actually I've just had an even better idea: we could simply ban any operands with explicit registers from appearing in the template string. So you would have to explicitly write eax in your asm code instead of using placeholders.