这是打印文本的简单代码:
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/