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

Hoo*_*Man 3 x86 assembly nasm labels

在NASM中编程时遇到问题。我正在学习如何纯粹以汇编形式开发OS,并且已经开始创建引导加载程序。

我目前的目标是打印“你好,世界!” 和“再见!” 使用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
Run Code Online (Sandbox Code Playgroud)

臭虫:

  1. 两次打印再见消息

    这是由于HELLO_MSG打印Hello, World!Goodbye!。我相信这是因为标签位于内存中标签的Hello_MSG旁边GOODBYE_MSG

;;;print_string.asm
print_string:                   ;cx = string length                                                                                                                                                          
                                ;bX = string label - memory offset                                                                                                                       
                                ; -- if you want the data at a memory adress use [bx]                                                                                                                        
        mov al, [bx]
        int 0x10

        inc bx

        loop print_string

        ret
Run Code Online (Sandbox Code Playgroud)

小智 6

您对的计算hlen包含字符串,Goodbye!因为它是在定义之后进行的GOODBYE_MSG。表达式$ - HELLO_MSG是标签HELLO_MSGhlen定义的行之间的字节数。这就是为什么您第一次打出的电话会同时print_string打印两条消息的原因。

请尝试以下命令:

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

GOODBYE_MSG db 'Goodbye!',0
glen equ $ - GOODBYE_MSG
Run Code Online (Sandbox Code Playgroud)

  • 谢谢!您的解决方案奏效了,我了解这个概念。我在这里留下一个链接来解释$和$$命令的工作原理。http://www.csc.depauw.edu/~bhoward/asmtut/asmtut9.html (2认同)