Получить первый аргумент макроса, разделенный пробелами - PullRequest
2 голосов
/ 10 июля 2020

Я хотел бы получить первый аргумент макроса, разделенного пробелами, в NASM. Это легко сделать, если аргументы разделены запятыми, например, это выдает 5 nops, игнорируя blah:

%macro foo 1+
times 5 %1
%endmacro
foo nop, blah

Как мне определить свой макрос foow, чтобы он работал как foow nop blah more-blah, т.е. аргументы, разделенные пробелами? Мне нужен только 1-й аргумент.

1 Ответ

3 голосов
/ 11 июля 2020

Вы можете использовать %defstr, а затем %substr в %rep l oop, чтобы выяснить, какова длина первой непустой последовательности. Затем используйте %deftok, чтобы преобразовать его обратно в токен, не являющийся строкой. Вот пример. (Обратите внимание, что переменная %$exit необходима только для некоторых более старых версий NASM, в которых были ошибки в обработке %exitrep.)

%macro bar 1.nolist
 %push
 %defstr %$string %1
 %strlen %$length %$string
 %assign %$ii 0
 %assign %$exit 0
 %rep %$length
  %substr %$point %$string %$ii + 1, 1
  %if %$point == 32 || %$point == 9
   %assign %$exit 1
   %exitrep
  %endif
  %ifn %$exit
   %assign %$ii %$ii + 1
  %endif
 %endrep
 %substr %$word %$string 1, %$ii
 %deftok %$token %$word
        %$token
 %pop
%endmacro


bar nop quux xyzzy

Вот тестовый прогон:

$ nasm -E test.asm
%line 22+1 test.asm


 nop
$ 
...