据我了解,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 是否比这更聪明,并使用其他方法来决定在任何给定时间哪个标签处于活动状态?
其实这种理解并不完全正确。本地标签不是独立的项目,它们实际上与最新的非本地标签相关联。
所以第二个代码示例实际上变成了:
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会起作用。
| 归档时间: |
|
| 查看次数: |
833 次 |
| 最近记录: |