NASM局部标签区分

标签 nasm

据我了解,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/

相关文章:

无法将参数从 C 传递到汇编代码

assembly - NASM - 获取堆栈中的项目数

assembly - 为什么这个引导加载程序代码不起作用?

linux - NASM Linux 中的 strlen

assembly - 可以始终使用 "mov eax, 0x1"代替 "mov rax, 0x1"吗?

assembly - 用更少的指令对 64 位寄存器中的所有字节进行异或

windows - 对 Win32 API 调用在汇编中的工作方式感到困惑

c - NASM x86 使用 extern printf 打印整数

assembly - MASM/NASM 差异

c - 在外部汇编程序中修改 C 数组