JSRUN 用代码说话

零终止字节

编辑教程

为什么第二个消息打印了两次而我们只在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.
JSRUN闪电教程系统是国内最先开创的教程维护系统, 所有工程师都可以参与共同维护的闪电教程,让知识的积累变得统一完整、自成体系。 大家可以一起参与进共编,让零散的知识点帮助更多的人。
X
支付宝
9.99
无法付款,请点击这里
金额: 0
备注:
转账时请填写正确的金额和备注信息,到账由人工处理,可能需要较长时间
如有疑问请联系QQ:565830900
正在生成二维码, 此过程可能需要15秒钟