我熟悉 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
?
前导点是 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
局部标签很有用,原因与局部变量在其他语言中有用的原因相同:它允许您使用简短的合理名称(如“循环”)而不会污染全局命名空间。