Возможно, это не очень хороший заголовок вопроса, но я хочу передать несколько строк сборки макросу nasm.Или, что то же самое, я хочу, чтобы макрос реализовал шаблонный «верх» и «низ» некоторого блока кода, но средний должен быть произвольным.
В качестве конкретного примера рассмотрим следующий источник назма:
%assign regn 8
%rep 8
%define reg r %+ regn
lea reg, [rsp - 8] ; body
push reg ; body
%assign regn (regn + 1)
%endrep
Это циклически повторяет все регистры от r8
до r15
и генерирует две строки кода "body" для каждого с результатом, подобным:
lea r8,[rsp-0x8]
push r8
lea r9,[rsp-0x8]
push r9
lea r10,[rsp-0x8]
push r10
lea r11,[rsp-0x8]
push r11
lea r12,[rsp-0x8]
push r12
lea r13,[rsp-0x8]
push r13
lea r14,[rsp-0x8]
push r14
lea r15,[rsp-0x8]
push r15
Я хотел бы выделить этот шаблон "loop over 8 register", который представляет собой все строки, не помеченные ; body
выше, в какой-то макрос, чтобы я мог вызывать его с различными типами тел.
Если бы тело было только одной строкой, это было бы так просто:
%macro loop_r8_r15 1
%assign regn 8
%rep 8
%define reg r %+ regn
%1 ; body
%assign regn (regn + 1)
%endrep
Однако я не могу найти естественный способ расширить это до нескольких строк.Я думаю, я мог бы использовать макрос, который принимает один или несколько аргументов, а затем «зацикливать» их в теле, но это означает, что вам нужно записать вызов макроса в одну строку с каждой строкой, вставленной вместе, а не в обычную однострочную-по инструкции, как вы хотели бы написать.Я также не уверен, как это работает, если само тело содержит вызовы макросов или другие директивы.