我熟悉TASM,但对NASM不太熟悉。我已经读过NASM允许使用本地标签,这些标签在名称前用点表示。例如,代码
.loop: ;some code
jmp .loop
定义名称为.loop的本地标签,引用的地址在后面的指令jmp中使用 但是,在线阅读一些代码示例,我发现像
这样的行.label1:
push label1
;other push
我感到困惑,因为label1没有在任何地方定义(因此它必须与.label1有关),但我既不理解这种推动的意义,也不理解代码是否应该推送.label1。 push label1
做了什么?
答案 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
局部标签之所以有用,是因为其与其他语言中的局部变量同样有用:它允许您使用简短的名称(例如“循环”)而不会污染全局名称空间。