如何从nasm中的数据部分只写一个字符串?

How to write only one string from data section in nasm?

尝试在 stdout 上顺序写入 msg1 和 msg2 以获得如下内容:

Hello
World

而是打印这个:

Hello
World
World

section .data     
                              
msg1    db 'Hello',10,0
msg2    db 'World',10,0

len1    equ     $- msg1                
len2    equ     $- msg2

section .text
global CMAIN
CMAIN:
   mov ebp, esp; for correct debugging

   mov edx,len1        
   mov ecx,msg1         
   call printString     
   

   mov edx, len2
   mov ecx, msg2
   call printString 
   
   mov eax,1            
   int 0x80        
 
printString:
   mov ebx,1          
   mov eax,4           
   int 0x80       
   xor eax, eax
   ret
 

有人能解释一下为什么会这样吗?

msg1    db 'Hello',10,0
msg2    db 'World',10,0

len1    equ     $- msg1                
len2    equ     $- msg2

$符号始终代表当前地址。因此 len1 equ $ - msg1len1 设置为 msg1 开始与定义 len1 的行上到达的地址之间的字节数 - 即 World 字符串之后。因此 len1 设置为 14,当您在第一次写入时写入 len1 字节时,您同时写入了 HelloWorld。然后你继续写 World 第二次写。

(您还包括空字节,这些空字节不会出现在终端上,但如果您将输出重定向到文件,将是不受欢迎的。请记住,write 不会注意null-termination;如果要写入的字节数中包含空字节,则将其写入。)

所以你想要的是

msg1    db 'Hello',10
len1    equ     $ - msg1    
msg2    db 'World',10
len2    equ     $ - msg2

现在 len1 是在它应该代表其长度的字符串之后立即定义的,所以它的值将是 6。我还从两个字符串中删除了 0 个字节。