Синтаксис для инициализации переменной будет register char *foo asm ("r12") = d;
для указания переменной asm-register на строку. Вы не можете использовать строку переменной времени выполнения в качестве имени регистра; варианты регистров должны быть собраны в машинный код во время компиляции.
Если это то, что вы пытаетесь сделать, вы неправильно понимаете что-то фундаментальное о языке ассемблера и / или о том, как скомпилированные заранее языки компилируются в машинный код. G CC не будет создавать самомодифицирующийся код (и даже если бы он захотел, безопасное выполнение этого потребовало бы повторного выделения регистров, выполненного опережающим оптимизатором) или кода, который повторно выполняет JIT на основе строки .
(В первый раз, когда я посмотрел на ваш вопрос, я не понял, что вы даже пытались сделать, потому что я только рассматривал то, что возможно. Комментарий @FelixG был подсказкой, которую мне нужно было сделать смысл вопроса.)
(Также обратите внимание, что регистры не индексируются; даже в asm вы не можете использовать одну инструкцию для чтения номера регистра, выбранного целым числом в другом регистре. Вы может ветвиться на нем, или хранить все регистры в памяти и индексировать, как функции вариади c делают для своих аргументов входящих регистров.)
И если вы сделаете Константный строковый литерал времени компиляции, просто используйте его с обычным синтаксисом. Используйте макрос CPP, если вы хотите, чтобы та же строка инициализировала массив символов.