Assembly nasm指令和宏的缩进
在普遍接受的nasm语法中,指令相对于标签缩进,如下所示:Assembly nasm指令和宏的缩进,assembly,x86,nasm,code-formatting,Assembly,X86,Nasm,Code Formatting,在普遍接受的nasm语法中,指令相对于标签缩进,如下所示: .top: dec eax jnz .top 像%rep这样的汇编指令和宏怎么样?应该是: .top: %rep 10 dec eax %endrep jnz .top 或 或者甚至是指令本身意味着额外缩进级别的其他指令——但这只适用于具有打开-关闭部分的“范围”指令,如%rep和%endrep,而不适用于独立或非嵌套的指令 .top: %rep 10 dec
.top:
dec eax
jnz .top
像%rep
这样的汇编指令和宏怎么样?应该是:
.top:
%rep 10
dec eax
%endrep
jnz .top
或
或者甚至是指令本身意味着额外缩进级别的其他指令——但这只适用于具有打开-关闭部分的“范围”指令,如%rep
和%endrep
,而不适用于独立或非嵌套的指令
.top:
%rep 10
dec eax
%endrep
jnz .top
还是别的什么?传统上,汇编代码是以四列布局编写的。这些栏目是:
%rep…%中的支撑endrep
空行示例:
.top: %rep 10
dec eax
%endrep
jnz .top
我喜欢在这里借鉴C预处理器风格,将NASM预处理器指令一直缩进到左侧。(或者嵌套
%if
和其他影响指令的块时,缩进为2个空格,因此即使嵌套的%if
也通常从指令助记符开始的列的左侧开始)
%rep
/%endrep
预处理器指令会影响它们之间的指令助记符,因此您肯定希望它们脱颖而出,而不是在周围的指令中混合和丢失。当你看到其中一个时,你希望能够在视觉上立即发现另一个,而不是上下扫描助记符栏寻找第一个匹配项。特别是如果有任何嵌套或其他预处理器的棘手问题
通常,您只会在多个指令或数据块上使用%rep
;否则,您将使用eax 12月10日的时间。(或者您正在使用%assign
在%rep
内部创建一个类似dec r10d
/dec r11d
/dec r12d
/…)的块)因此,实际用例不会像本例那样简单,匹配的%endrep
//%rep
将相隔两行以上
当您混合使用标签和%if
/%rep
指令时,很难看到标签。您不希望%rep
也将最左边的列弄乱
Michael Petch建议进一步缩进要重复的说明,这是一个很好的建议。无论如何,它们都很特别,读者注意到这一点很重要。但它们是类似于指令的,因为它们扩展到一个指令块,因此在指令列中启动%rep
非常有意义,缩进封闭的块可以很容易找到该块的开始/结束
%if USE_SIMPLE_LOOP
.top:
%rep 10
imul ecx, edx
dec edx
%endrep
sub eax, 10
jg .top
请注意,我进一步缩进了操作数,为超过3个字符的助记符留出了空间,而不会使操作数列参差不齐
我故意将分支目标列缩进比其他操作数少1列,这使得它稍微突出一些,但并不难看。尤其是当目标是以开头的本地标签时
但是,根据%rep
的使用情况,最好将指令缩进普通列,并在%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
像%rep
这样的指令是一种对其他行(rep和endrep之间)有影响的“元”事物,因此它们的行为与扩展到多个助记符的指令或宏非常不同。@rcgldr不正确。C代码总是用制表符缩进(每个制表位8个空格),在BSD中有4个空格用于连续行,对于汇编编程,历史上设置了特殊的制表符。UNIX仍然有**tabs**(1)实用程序为各种大型机汇编程序设置制表位。@rcgldr书本中的间距并不表示实际使用的间距,主要是出于布局考虑。如果您查看从那时起的C代码,它几乎完全用制表符缩进,制表位过去和现在都设置为每8个位置一个制表位。@rcgldr对于汇编编程,制表位是不同的。请参阅制表符手册(1),了解不同(大型机)装配机常用的各种制表符挡块。GNU手册页没有列出确切的制表位,但POSIX和BSD会列出。@fuz-对于Microsoft Masm(X86),将第一列调用为1,然后调用1、9、17,并在某些“制表符”边界处添加注释,可以选择使用制表符==8个空格。对于IBM 360系列assembler,则第1、10、16、36或40列以及通常不使用的制表符,因为该标准基于穿孔卡,即使存储在磁盘或磁带上也是如此。投票结束该标准的人:这不是要求非现场参考。如标签的(不)-使用指南中所述,适当的结束原因将是“主要基于意见”。我还是选择回答它,因为NASM没有任何/许多公认的冲突样式指南。@PeterCordes-代码格式标签的存在似乎表明至少有一些代码格式问题与主题有关。我认为有问题的,被认为是“不具建设性的”是基于观点的,比如“C中使用什么样的括号样式”或者有很多选项的命名约定。我希望在nasm的案例中有一种被普遍接受或历史上使用的风格,至少因为它与指令有关,因此它是建设性的。我认为应该是关于编写或使用
%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