Я хочу написать в двух местах что-то такое lea rax, %, где на нечетных итерациях встаёт mem/write, вместо значка %, а на чётных итерациях write/mem. Как это сделать?
То есть ты хочешь, чтобы тебе ассемблер неизвестно что неизвестно как подставил на этапе компиляции? Не будет так. Вычисляй в рантайме. Ветвлениями, по таблице или ещё как. Или конкретизируй задачу.
Первая итерация- lea rax, mem. Потом lea rax, write. Вторая итерация - lea rax, write, затем lea rax, mem. В двух местах, где должны интерпретироваться эти команды, стоит lea rax, %.
А ассемблер-то как узнает во время компиляции, какая сейчас итерация? Он может узнать только тогда, когда ты средствами ассемблера разворачиваешь цикл (ну там repeat/rept в фасме, например).
Во время исполнения нет никаких имён и массивов. И тем более нет макросов. Во время исполнения адрес придётся вычислять: тестировать младший бит счётчика и выполнять в зависимости от него один из двух вариантов.
Как так лучше сделать? Lea rax %1 в одном месте, lea rax %2 во втором месте. А где-то в коде mov %1, mem, и mov %2, write для нечетной итерации и mov %1, write и mov %2, mem для четной итерации.