Nasm点缀标签

时间:2017-02-26 22:12:01

标签: assembly nasm

我熟悉TASM,但对NASM不太熟悉。我已经读过NASM允许使用本地标签,这些标签在名称前用点表示。例如,代码

.loop: ;some code
       jmp .loop

定义名称为.loop的本地标签,引用的地址在后面的指令jmp中使用 但是,在线阅读一些代码示例,我发现像

这样的行
.label1:
        push label1
        ;other push

我感到困惑,因为label1没有在任何地方定义(因此它必须与.label1有关),但我既不理解这种推动的意义,也不理解代码是否应该推送.label1。 push label1做了什么?

1 个答案:

答案 0 :(得分:2)

前导点是NASM用于制作本地标签的语法,该语法实际上嵌套在最后一个普通(非本地)标签的顶部。

sum_ints: ; input: ecx is loop counter
    mov eax,0  ; the sum
    jmp .check
    .loopstart:
        add eax,ecx ; add counter to sum
        sub ecx,1 ; decrement counter
        .check:
        cmp ecx,0 ; see if we're done
        jg .loopstart
    ret

此处“ sum_ints”是常规的顶级标签,而.loopstart和.check是本地标签。

.loopstart变成sum_ints.loopstart,因此您实际上可以从其范围之外引用点标签。 (这使NASM可以将本地标签放入目标文件的符号表中,而不会发生冲突。)


有关详细信息,请参见NASM手册:   https://www.nasm.us/doc/nasmdoc3.html#section-3.9

局部标签之所以有用,是因为其与其他语言中的局部变量同样有用:它允许您使用简短的名称(例如“循环”)而不会污染全局名称空间。