Nasm 虚线标签

Nic*_*ola 2 assembly nasm

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

.loop: ;some code
       jmp .loop
Run Code Online (Sandbox Code Playgroud)

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

.label1:
        push label1
        ;other push
Run Code Online (Sandbox Code Playgroud)

我很困惑,因为 label1 没有在任何地方定义(所以它必须以某种方式与 .label1 相关),但我既不明白这种推送的含义,也不明白代码是否应该是 push .label1 。有什么作用push label1

Ori*_*lor 6

前导点是 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
Run Code Online (Sandbox Code Playgroud)

这里“sum_ints”是正常的顶级标签,而 .loopstart 和 .check 是本地标签。

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


详细信息在 NASM 手册中有说明:https : //www.nasm.us/doc/nasmdoc3.html#section-3.9

局部标签很有用,原因与局部变量在其他语言中有用的原因相同:它允许您使用简短的合理名称(如“循环”)而不会污染全局命名空间。