为什么第二个消息打印了两次而我们只在msg2上调用了sprint函数一次?实际上它只打印了一次。你可以看到我的意思,如果你评论我们的第二次呼吁冲刺。输出将是我们的两个消息字符串。
但这怎么可能呢?
我们没有正确终止字符串。在汇编中,变量一个接一个地存储在内存中,因此msg1变量的最后一个字节就紧挨着msg2变量的第一个字节。我们知道我们的字符串长度计算是寻找一个零字节,所以除非我们的msg2变量以一个零字节开始,它继续计数,就像它是相同的字符串(就程序集而言,它是相同的字符串)。因此,我们需要在字符串后放一个0字节或0h,让程序集知道在哪里停止计数。
注意:在编程中,0h表示空字节,而字符串后的空字节则告诉程序集它在内存中的结束位置。
helloworld-inc.asm
; Hello World Program (NULL terminating bytes)
; Compile with: nasm -f elf helloworld-inc.asm
; Link with (64 bit systems require elf_i386 option): ld -m elf_i386 helloworld-inc.o -o helloworld-inc
; Run with: ./helloworld-inc
%include 'functions.asm'
SECTION .data
msg1 db 'Hello, brave new world!', 0Ah, 0h ; NOTE the null terminating byte
msg2 db 'This is how we recycle in NASM.', 0Ah, 0h ; NOTE the null terminating byte
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.