汇编语言学习_6_终止字符串
第六节
终止字符
为什么 Lesson 5 中的第二个字符串打印了两次,而我们只在 msg2
上调用了一次 sprint
函数?如果将第二次的 sprint
调用注释掉,结果如下,我们发现在 Lesson 5 中第二次的 sprint
实际上只打印了一次,但 第一次的 sprint
将两个字符串都打印了。
但这怎么可能呢?
那是因为我们没有正确终止字符串。在汇编中,变量一个接一个地存储在内存中,因此 msg1
的最后一个字节紧邻 msg2
的第一个字节。我们知道字符串长度计算是在寻找零字节 \0
,因此除非 msg2
变量以零字节开头,否则它会一直计数,就像它是同一个字符串一样(对汇编来说,它是相同的字符串)。所以,我们需要在字符串后面放一个零字节 0h
,让程序集知道在哪里停止计数。
注意:在编程中,0h
表示一个空字节,字符串后的空字节告诉程序集它在内存中的结束位置。
; Hello World Program (NULL terminating bytes)
; 编译: nasm -f elf helloworld-inc.asm
; 链接 (64 bit systems require elf_i386 option): ld -m elf_i386 helloworld-inc.o -o helloworld-inc
; 运行: ./helloworld-inc
%include 'functions.asm'
SECTION .data
msg1 db 'Hello, brave new world!', 0Ah, 0h ; 注意为空(0)的终止字节(字符)
msg2 db 'This is how we recycle in NASM.', 0Ah, 0h ; 注意为空(0)的终止字节(字符)
SECTION .text
global _start
_start:
mov eax, msg1
call sprint
mov eax, msg2
call sprint
call quit
~$ nasm -f elf helloworld-inc.asm
~$ ld -m elf_i386 helloworld-inc.o -o helloworld-inc
~$ ./helloworld-inc
Hello, brave new world!
This is how we recycle in NASM.
This is how we recycle in NASM.