Assembly equ$-指令如何获得nasm语法中字符串的长度?
这是打印文本的简单代码:Assembly equ$-指令如何获得nasm语法中字符串的长度?,assembly,nasm,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 r
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
在下一个位置和标签之间产生差异。由于该标签出现较早,因此该差值为正值,实际上它是前面的db
的总长度
eq
表示将lengthofString
定义为编译时常量,它不消耗任何运行时存储
请注意,要使其正常工作,包含$
的eq
表达式必须紧跟在字符串后面。否则,如果有中间的数据声明,计数也会包括它们,这将是不好的
在不使用$
的情况下,以下操作也可以,但需要两个标签,第二个标签必须正好出现在所需长度的数据之后:
myString db "This is a string for test", 10
endOfmyString
...
lengthofString equ endOfmyString - myString
额外的标签不会添加到程序的存储中,并且再次将
lengthofString
计算为编译(汇编)时间常数。感谢您的帮助,我喜欢第二种方法,我尝试使用它,起初我得到了冒号错误,在将冒号添加到标签末尾后,它工作正常