我喜欢从C预处理器样式中借鉴,将NASM预处理器指令全部缩进到最左边。(或者在嵌套的%if和其他块影响指令的情况下,使用2个空格进行缩进,因此即使是嵌套的%if,它通常也会从指令助记符开始的列的左侧开始)。
%rep / %endrep预处理器指令会影响它们之间的指令助记符,因此您肯定希望它们突出,而不是在周围的指令中丢失。当您看到一个时,您希望能够立即在视觉上发现另一个,而不是在助记符列中向上或向下扫描第一个匹配项。特别是如果有任何嵌套或其他预处理器技巧。
通常,您只会在多个指令或数据块上使用%rep;否则,您将使用time 10 dec eax。(或者您在%rep内部使用%assign创建像dec r10d / dec r11d / dec r12d / ...这样的块) 因此,实际用例不会像这个示例那么简单,并且匹配的%endrep / %rep将远离2行。
当您混合使用标签和%if / %rep指令时,可能更难看到标签。您不希望%rep也在最左边的列上杂乱无章。
Michael Petch的建议进一步缩进要重复的指令是一个很好的建议。它们本来就很特殊,读者注意到这一点很重要。但是,它们像指令一样扩展到一块指令,因此在指令列中启动%rep非常有意义,并且缩进所包含的块使其易于找到该块的开始/结束。
%if USE_SIMPLE_LOOP
.top:
%rep 10
imul ecx, edx
dec edx
%endrep
sub eax, 10
jg .top
请注意,我将我的操作数缩进得更远,为助记符留出空间,使操作数列不会变得凌乱。
我故意将分支目标缩进了1列,这使它稍微突出而不显得丑陋。特别是当目标是以
.
开头的本地标签时。
但是,根据
%rep
的用例,将指令保留在正常列中并在标签和指令之间使用一列可能会看起来更好。
%if USE_SIMPLE_LOOP
.top: ; could indent the label by a column or two inside %if
%rep 10 ; unroll
imul ecx, edx
%endrep
sub eax, 10
jg .top
%endif