Assembly 在NASM中,内存中彼此相邻的标签会导致打印问题

Assembly 在NASM中,内存中彼此相邻的标签会导致打印问题,assembly,x86,nasm,labels,Assembly,X86,Nasm,Labels,我在NASM编程时遇到问题。我正在学习如何纯粹在汇编中开发操作系统,并从创建引导加载程序开始 我目前的目标是使用BIOS中断0x10打印“你好,世界!”和“再见” 我似乎遇到的问题发生在屏幕上打印值时。两个标签在内存中相邻,导致打印一个字符串时打印另一个字符串的内容 为什么hlen不在第一个字符串的末尾停止循环 [org 0x7c00] mov ah, 0x0e mov bx, HELLO_MSG mov cx, hlen

我在NASM编程时遇到问题。我正在学习如何纯粹在汇编中开发操作系统,并从创建引导加载程序开始

我目前的目标是使用BIOS中断0x10打印“你好,世界!”和“再见”

我似乎遇到的问题发生在屏幕上打印值时。两个标签在内存中相邻,导致打印一个字符串时打印另一个字符串的内容

为什么
hlen
不在第一个字符串的末尾停止循环

    [org 0x7c00]

    mov ah, 0x0e

    mov bx, HELLO_MSG
    mov cx, hlen                                                                                                                                              
    call print_string

    mov bx, GOODBYE_MSG
    mov cx, glen                                                                                                                                              
    call print_string

    jmp $

    %include "print_string.asm"


    HELLO_MSG db 'Hello, World!',0
    GOODBYE_MSG db 'Goodbye!',0


    hlen equ $ - HELLO_MSG
    glen equ $ - GOODBYE_MSG

    times 510-($-$$) db 0
    dw 0xaa55
错误:

  • 打印两次“再见”消息

    这是由于HELLO_MSG打印
    你好,世界
    再见。
    我相信这是因为
    Hello\u MSG
    标签就在内存中的
    再见\u MSG
    标签旁边


  • 您对
    hlen
    的计算包括字符串
    再见
    因为它是在
    再见\u MSG
    的定义之后出现的。表达式
    $-HELLO\u MSG
    是标签
    HELLO\u MSG
    和定义
    hlen
    的行之间的字节数。这就是为什么第一次调用
    print\u string
    会打印这两条消息

    请尝试以下顺序:

    HELLO_MSG db 'Hello, World!',0
    hlen equ $ - HELLO_MSG
    
    GOODBYE_MSG db 'Goodbye!',0
    glen equ $ - GOODBYE_MSG
    

    有关更多详细信息,请参见,并以此为例。

    谢谢!你的解决方案奏效了,我理解这个概念。我在这里留下一个链接来解释$和$$命令是如何工作的。@HoodedMan:您应该删除消息中的零,因为它们不应该显示,也不应该在这里用作终止符。(它们可能会输出为funky空格。)有关更多详细信息,请参阅。
    HELLO_MSG db 'Hello, World!',0
    hlen equ $ - HELLO_MSG
    
    GOODBYE_MSG db 'Goodbye!',0
    glen equ $ - GOODBYE_MSG