Я нашел этот макрос в исходном файле сборки, и я просто не могу понять, как он работает.Общие сведения о макросе NASM
Так первый я приезжаю вокруг этой функции (hevc_deblock.h):
cglobal hevc_v_loop_filter_chroma_8, 3, 5, 7, pix, stride, tc, pix0, r3stride
sub pixq, 2
lea r3strideq, [3*strideq]
mov pix0q, pixq
add pixq, r3strideq
TRANSPOSE4x8B_LOAD PASS8ROWS(pix0q, pixq, strideq, r3strideq)
CHROMA_DEBLOCK_BODY 8
TRANSPOSE8x4B_STORE PASS8ROWS(pix0q, pixq, strideq, r3strideq)
RET
Так я полагаю, что cglobal
, кажется, сделать некоторые имя коверкая, так что я смотрю его в другой включаемые файлы в Я считаю, что макрос внутри cglobal
макросъемки (x86util.asm):
%macro CAT_UNDEF 2
%undef %1%2
%endmacro
%macro DEFINE_ARGS 0-*
%ifdef n_arg_names
%assign %%i 0
%rep n_arg_names
CAT_UNDEF arg_name %+ %%i, q
CAT_UNDEF arg_name %+ %%i, d
CAT_UNDEF arg_name %+ %%i, w
CAT_UNDEF arg_name %+ %%i, h
CAT_UNDEF arg_name %+ %%i, b
CAT_UNDEF arg_name %+ %%i, m
CAT_UNDEF arg_name %+ %%i, mp
CAT_UNDEF arg_name, %%i
%assign %%i %%i+1
%endrep
%endif
%xdefine %%stack_offset stack_offset
%undef stack_offset ; so that the current value of stack_offset doesn't get baked in by xdefine
%assign %%i 0
%rep %0
%xdefine %1q r %+ %%i %+ q
%xdefine %1d r %+ %%i %+ d
%xdefine %1w r %+ %%i %+ w
%xdefine %1h r %+ %%i %+ h
%xdefine %1b r %+ %%i %+ b
%xdefine %1m r %+ %%i %+ m
%xdefine %1mp r %+ %%i %+ mp
CAT_XDEFINE arg_name, %%i, %1
%assign %%i %%i+1
%rotate 1
%endrep
%xdefine stack_offset %%stack_offset
%assign n_arg_names %0
%endmacro
Это, кажется, делает это имя коверкая и добавьте q
в конце аргументов. Однако я не понимаю, почему существует несколько строк директив %undef
, и в этой функции используется только имя переменной с суффиксом q
. Он также, кажется, добавляет число в конце, но по какой-то причине я не вижу его в другом asm-файле.
Что мне здесь не хватает?
Хорошо, что вся макроса, которая позаботится об обработке стека для вас, довольно аккуратная из того, что я видел. Кажется, что это намного лучше, чем встроенная сборка (и все проблемы с переносимостью, которые возникают с ней), хотя я согласен, если производительность не является проблемой, в которой нет необходимости. Большое вам спасибо за разъяснение всего этого, я хочу, чтобы потомки они могли включить ваш ответ в комментарии. – meneldal