汇编语言学习_6_终止字符串

第六节

终止字符

翻译自:https://asmtutor.com/

为什么 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.
posted @ 2023-03-02 10:58  charain_li  阅读(105)  评论(0编辑  收藏  举报