如何从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 $ - msg1
将 len1
设置为 msg1
开始与定义 len1
的行上到达的地址之间的字节数 - 即 在 World
字符串之后。因此 len1
设置为 14,当您在第一次写入时写入 len1
字节时,您同时写入了 Hello
和 World
。然后你继续写 World
第二次写。
(您还包括空字节,这些空字节不会出现在终端上,但如果您将输出重定向到文件,将是不受欢迎的。请记住,write
不会注意null-termination;如果要写入的字节数中包含空字节,则将其写入。)
所以你想要的是
msg1 db 'Hello',10
len1 equ $ - msg1
msg2 db 'World',10
len2 equ $ - msg2
现在 len1
是在它应该代表其长度的字符串之后立即定义的,所以它的值将是 6。我还从两个字符串中删除了 0 个字节。
尝试在 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 $ - msg1
将 len1
设置为 msg1
开始与定义 len1
的行上到达的地址之间的字节数 - 即 在 World
字符串之后。因此 len1
设置为 14,当您在第一次写入时写入 len1
字节时,您同时写入了 Hello
和 World
。然后你继续写 World
第二次写。
(您还包括空字节,这些空字节不会出现在终端上,但如果您将输出重定向到文件,将是不受欢迎的。请记住,write
不会注意null-termination;如果要写入的字节数中包含空字节,则将其写入。)
所以你想要的是
msg1 db 'Hello',10
len1 equ $ - msg1
msg2 db 'World',10
len2 equ $ - msg2
现在 len1
是在它应该代表其长度的字符串之后立即定义的,所以它的值将是 6。我还从两个字符串中删除了 0 个字节。