I see this thread is a duplicate of this one: Replacing Macros
As an alternative to using the eager-expansion of macros in the concat!
macro's arguments; you could also use my new crate, preinterpret, which works by pre-processing the code.
But the register definition has to be set in the same block as its use, which may not fit your needs:
// If asm! takes a string
preinterpret::preinterpret!{
[!set! #temp = "el2"]
asm!(
[!string! "msr x, " #temp]
)
}