Variables 汇编$-运算符
我遇到了以下代码:Variables 汇编$-运算符,variables,assembly,Variables,Assembly,我遇到了以下代码: SYS_EXIT equ 1 SYS_WRITE equ 4 STDIN equ 0 STDOUT equ 1 section .text global _start ;must be declared for using gcc _start: ;tell linker entry point mov eax, SYS_WRITE mov ebx, STDOUT mov ecx,
SYS_EXIT equ 1
SYS_WRITE equ 4
STDIN equ 0
STDOUT equ 1
section .text
global _start ;must be declared for using gcc
_start: ;tell linker entry point
mov eax, SYS_WRITE
mov ebx, STDOUT
mov ecx, msg1
mov edx, len1
int 0x80
mov eax, SYS_WRITE
mov ebx, STDOUT
mov ecx, msg2
mov edx, len2
int 0x80
mov eax, SYS_WRITE
mov ebx, STDOUT
mov ecx, msg3
mov edx, len3
int 0x80
mov eax,SYS_EXIT ;system call number (sys_exit)
int 0x80 ;call kernel
section .data
msg1 db 'Hello, programmers!',0xA,0xD
len1 equ $ - msg1
msg2 db 'Welcome to the world of,', 0xA,0xD
len2 equ $ - msg2
msg3 db 'Linux assembly programming! '
len3 equ $- msg3
凭直觉,我可以看出len1
、len2
和len3
是保存三个字符串长度的变量,$-
运算符正在获取字符串的长度
但我无法正确理解查找长度的语法是如何工作的。。任何人,请告诉我它是如何做的,并给我进一步阅读的链接,以了解这个概念
提前感谢…
$
计算为“当前地址”,因此$-msg1
表示“当前地址减去带有标签msg1的地址”。这将计算从msg1
开始的字符串长度
您的代码片段看起来可能是NASM。它是?无论如何,NASM有其特殊的标记
$
和$
$
计算为“当前地址”,因此$-msg1
表示“当前地址减去带标签msg1的地址”。这将计算从msg1
开始的字符串长度
您的代码片段看起来可能是NASM。它是?无论如何,NASM有它的特殊标记
$
和$
如果我连续声明两个MSG,然后执行$-msg1
它会给我两个字符串的长度吗?因为正如你所说,$是当前地址,$在什么意义上是“当前地址”?我的意思是,你所说的“当前地址”是什么意思?NASM文档对它的定义如下:“$计算到行开头的装配位置”。我找到了一个新的。这里讨论得更多一些,我道歉。但是你能用一种更简单的方式解释它吗?eq
是一种汇编时构造:它不存在于生成的可执行文件中,因此它本身永远不会执行。汇编程序(例如NASM)从上到下读取文件,并根据前一行在生成的可执行文件中占用的空间量计算每一行开始的地址(“汇编位置”)。这就是我所说的“当前地址”。如果我连续声明两个MSG,然后执行$-msg1
会给我两个字符串的长度吗?因为正如你所说,$是当前地址,$在什么意义上是“当前地址”?我的意思是,你所说的“当前地址”是什么意思?NASM文档对它的定义如下:“$计算到行开头的装配位置”。我找到了一个新的。这里讨论得更多一些,我道歉。但是你能用一种更简单的方式解释它吗?eq
是一种汇编时构造:它不存在于生成的可执行文件中,因此它本身永远不会执行。汇编程序(例如NASM)从上到下读取文件,并根据前一行在生成的可执行文件中占用的空间量计算每一行开始的地址(“汇编位置”)。这就是我所说的“当前地址”。