0

我遇到了以下代码:

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

凭直觉,我可以看出len1len2len3是保存三个字符串长度的变量,并且$ -操作员正在获取它的长度..

但我无法正确理解查找长度的语法是如何工作的。任何人都可以告诉我它是如何工作的,并给我链接以供进一步阅读,以理解这个概念。

提前致谢...

4

1 回答 1

3

$计算为“当前地址”,因此$ - msg1表示“当前地址减去带有标签 msg1 的地址”。这将计算从 开始的字符串的长度msg1

您的代码段看起来可能是 NASM。是吗?无论如何,NASM 有其特殊令牌的文档$$$.

于 2013-08-19T11:24:01.170 回答