Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly equ$-指令如何获得nasm语法中字符串的长度?_Assembly_Nasm - Fatal编程技术网

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
计算为编译(汇编)时间常数。

感谢您的帮助,我喜欢第二种方法,我尝试使用它,起初我得到了冒号错误,在将冒号添加到标签末尾后,它工作正常