assembly - Nasm 点缀标签

标签 assembly nasm

我熟悉 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/

相关文章:

汇编语言循环不工作

c++ - x86 MASM - 传递和访问二维数组

linux - 为什么我无法成功将变量内容压入堆栈?

assembly - 这个 shellcode 中的堆栈指针有什么用?

include - NASM - 相关包含文件

c++ - 错误 : ‘asm’ operand has impossible constraints when using gcc 32bit

c++ - 我的汇编代码有什么问题

string - Nasm equ $-获得错误的长度

macos - 为什么系统调用不起作用?

c - 如何从 C/汇编中的内存地址执行函数?