gpt4 book ai didi

assembly - Nasm 点缀标签

转载 作者:行者123 更新时间:2023-12-05 01:19:03 25 4
gpt4 key购买 nike

我熟悉 TASM 但不太熟悉 NASM。我读过 NASM 允许使用本地标签,这些标签在名称前用点表示。例如代码

.loop: ;some code
jmp .loop

定义一个局部标号,名称为.loop,引用的地址在后面的指令jmp中使用。
然而,在线阅读一些代码示例我发现像

这样的行
.label1:
push label1
;other push

我很困惑,因为 label1 没有在任何地方定义(因此它必须以某种方式与 .label1 相关),但我既不理解这种推送的含义,也不理解代码是否应该推送 .label1 。 push label1 有什么作用?

最佳答案

前导点是 NASM 用于制作本地标签的语法,它基本上嵌套在最后一个普通(非本地)标签之上。

sum_ints: ; input: ecx is loop counter
mov eax,0 ; the sum
jmp .check
.loopstart:
add eax,ecx ; add counter to sum
sub ecx,1 ; decrement counter
.check:
cmp ecx,0 ; see if we're done
jg .loopstart
ret

这里的“sum_ints”是普通的顶层标签,而.loopstart 和.check 是局部标签。

.loopstart 变为 sum_ints.loopstart,因此您实际上可以从其范围之外引用点标签。 (这让 NASM 可以将本地标签放入目标文件的符号表中而不会发生冲突。)


NASM 手册中有详细说明: https://www.nasm.us/doc/nasmdoc3.html#section-3.9

局部标签的用处与局部变量在其他语言中的用处相同:它允许您使用简短的合理名称(如“loop”)而不会污染全局命名空间。

关于assembly - Nasm 点缀标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42474854/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com