NASM局部标签区分

pax*_*blo 5 nasm

据我了解,NASM(像所有优秀的汇编程序一样)允许您通过在它们前面加上句点来定义本地标签,并且它允许以后的定义覆盖以前的定义。

我看到的演示代码如下所示:

part1  mov   ax, 10
.loop  ; do something
       dec   ax
       jnz   .loop 

part2  mov   ax, 50
.loop  ; do something
       dec   ax
       jnz   .loop 
Run Code Online (Sandbox Code Playgroud)

在这种情况下,后面的定义会覆盖前面的定义,以便选择正确的标签。

但是,我看不出它在以下场景中是如何工作的。

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
Run Code Online (Sandbox Code Playgroud)

jz .fin第二个循环的组装点,肯定是较早的实例.fin肯定仍然是活动的,它会跳到错误的位置。

或者 NASM 是否比这更聪明,并使用其他方法来决定在任何给定时间哪个标签处于活动状态?

pax*_*blo 6

其实这种理解并不完全正确。本地标签不是独立的项目,它们实际上与最新的非本地标签相关联。

NASM 手册第 3.9 节本地标签

所以第二个代码示例实际上变成了:

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
Run Code Online (Sandbox Code Playgroud)

然后问题就消失了。

事实上,你其实可以参照的局部标签为非本地的。换句话说,如果你想离开part1并完全跳过part2,你可以使用类似的东西:

            jmp   part2.fin
Run Code Online (Sandbox Code Playgroud)

从某处part1。使用.finfrom insidepart1是行不通的,因为那会 select part1.fin,但完全合格的part2.fin会起作用。