据我了解,NASM(像所有优秀的汇编程序一样)允许您通过在它们前面加上句点来定义本地标签,并且它允许以后的定义覆盖以前的定义。
我看到的演示代码如下所示:
part1 mov ax, 10
.loop ; do something
dec ax
jnz .loop
part2 mov ax, 50
.loop ; do something
dec ax
jnz .loop
在这种情况下,后面的定义会覆盖前面的定义,以便选择正确的标签。
但是,我看不出它在以下场景中是如何工作的。
part1 mov ax, 10
.loop jz .fin
; do something else
dec ax
jmp .loop
.fin
part2 mov ax, 50
.loop jz .fin
; do something else
dec ax
jmp .loop
.fin
在
jz .fin
处在第二个循环中,肯定是 .fin
的早期实例。仍将处于事件状态,并且会跳到错误的位置。或者 NASM 是否比这更聪明,并使用其他方法来决定在任何给定时间哪个标签处于事件状态?
最佳答案
其实这种理解并不完全正确。本地标签不是独立的项目,它们实际上与最新的非本地标签相关联。
NASM manual section 3.9 Local Labels
所以第二个代码示例实际上变成了:
part1 mov ax, 10
part1.loop jz part1.fin
; do something else
dec ax
jmp part1.loop
part1.fin
part2 mov ax, 50
part2.loop jz part2.fin
; do something else
dec ax
jmp part2.loop
part2.fin
然后问题就消失了。
实际上,您实际上可以将本地标签称为非本地标签。换句话说,如果你想离开
part1
并完全跳过 part2
完全,你可以使用类似的东西: jmp part2.fin
来自
part1
内的某个地方.使用 .fin
从内部 part1
不会工作,因为那会选择 part1.fin
, 但完全合格 part2.fin
会做的伎俩。
关于NASM局部标签区分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31714960/