作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我熟悉 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/
我是一名优秀的程序员,十分优秀!