我熟悉TASM,但不太熟悉NASM。我读过NASM允许使用本地标签,这些标签在名称之前用一个点表示。例如,代码
.loop: ;some code
jmp .loop定义一个名为.loop的本地标签,并在后面的指令jmp中使用引用的地址。
然而,在网上阅读一些代码示例,我会发现以下几行:
.label1:
push label1
;other push我感到困惑,因为label1没有在任何地方定义(所以它必须与.label1有某种联系),但我既不理解这种推的含义,也不理解代码是否应该是push .label1。push label1是做什么的?
发布于 2018-10-05 00:11:52
引导点是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中作了解释。
本地标签之所以有用,原因与局部变量在其他语言中有用的原因相同:它允许您在不污染全局命名空间的情况下使用简短、合理的名称(如“循环”)。
https://stackoverflow.com/questions/42474854
复制相似问题