gpt4 book ai didi

NASM局部标签区分

转载 作者:行者123 更新时间:2023-12-03 15:58:59 29 4
gpt4 key购买 nike

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

29 4 0