Макросы NASM с «многострочными аргументами» - PullRequest
0 голосов
/ 18 сентября 2018

Возможно, это не очень хороший заголовок вопроса, но я хочу передать несколько строк сборки макросу 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

Однако я не могу найти естественный способ расширить это до нескольких строк.Я думаю, я мог бы использовать макрос, который принимает один или несколько аргументов, а затем «зацикливать» их в теле, но это означает, что вам нужно записать вызов макроса в одну строку с каждой строкой, вставленной вместе, а не в обычную однострочную-по инструкции, как вы хотели бы написать.Я также не уверен, как это работает, если само тело содержит вызовы макросов или другие директивы.

...