Рассмотрим макрос nasm, который используется для вставки некоторой сборки при каждом вызове, в этом случае для проверки, равен ли переданный аргумент 42:
%macro special_handler_if_42 1
cmp 42, %1
jne %%skip
; some additional assembly to handle the %1 == 42 case
push %1
push 42
call some_func
%%skip:
%endmacro
В случае, если равно мы выполняем какое-то дополнительное действие, в противном случае мы просто продолжаем с кодом, следующим за макросом.Пока все хорошо.
Теперь я хочу написать макрос функционально идентичным образом, за исключением того, что регистр «равно 42», который бывает очень редким, перемещен «вне строки»,так что случай сброса (без перехода) является случаем по умолчанию, что-то вроде (не показано в виде макроса сейчас):
cmp 42, rax
je equals_42
jump_back:
; the rest of the code that follows the macro
ret
; somewhere outside the current function
equals_42:
push rax
push 42
call some_func
jmp jump_back
Это будет более эффективным во время выполнения и потенциально может сохранитьпространство кеша.Я не уверен, как написать макрос с нелокальным эффектом, как это.Идеи приветствуются.