assembly - nasm 语法中的 equ $ - 指令如何获取字符串的长度?

标签 assembly nasm

这是打印文本的简单代码:

    section .data
            myString db "This is a string for test", 10
            lengthofString equ $ -myString

    section .text
            global _start
    _start:
            mov rax, 1
            mov rdi, 1
            mov rsi, myString
            mov rdx, lengthofString
            syscall

            mov rax, 60
            mov rdi, 0
            syscall

我的问题是这行代码在这个简单的程序中到底是如何工作的?

    lengthofString equ $ -myString

最佳答案

$ 表示可以容纳字节的下一个空闲位置或偏移量(此处,在运行时的数据部分中)。

因此表达式 $ - myString 产生下一个位置和标签之间的差异。由于该标 checkout 现较早,因此该差异是正值,实际上它是前面的 db 的总长度。

equ 表示将 lengthofString 定义为编译时常量,它不会消耗任何运行时存储。

请注意,要使其正常工作,包含 $equ 表达式必须紧跟在字符串之后。否则,如果存在中间数据声明,计数也会包括它们,这将是糟糕的。

以下内容也可以工作,无需使用 $,但需要两个标签,并且第二个标签必须出现在您想要长度的数据之后:

myString db "This is a string for test", 10
endOfmyString
...
lengthofString equ endOfmyString - myString

额外的标签不会添加到程序的存储中,并且再次将lengthofString计算为编译(汇编)时间常数。

关于assembly - nasm 语法中的 equ $ - 指令如何获取字符串的长度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57746534/

相关文章:

assembly - 当使用多个数据库声明时,NASM 编译 x86_64 ASM 标签地址在 Mach-O 中减少 256 个字节?

c - 如何将文件指针从 c 传递到 asm 中的调用

linux - x86 上的任务管理

c - 在 x86 Assembly 中组装代码时出错

gcc - x86_64 "gcc -S"-> as -> ld -> 执行失败

gcc - 如何在 NASM 中编写 GRUB stage1.S?

linux - 为 x64 系统调用编译的 x32 ASM(使用 NASM)不起作用

assembly - 可以始终使用 "mov eax, 0x1"代替 "mov rax, 0x1"吗?

linux nasm 程序集不断地打印字符

assembly - Intel x86 汇编语法中寄存器上的括号