Assembly 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

在普遍接受的nasm语法中,指令相对于标签缩进,如下所示:

.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