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

时间:2014-11-12 22:11:43

标签: assembly x86 nasm labels

我在NASM编程时遇到问题。我正在学习如何纯粹在汇编中开发一个操作系统,并且已经开始创建一个启动加载器。

我目前的目标是打印“Hello,World!”和“再见!”使用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

错误:

  1. 两次打印再见信息

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

  2. ;;;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
    

1 个答案:

答案 0 :(得分:4)

您对hlen的计算包含字符串Goodbye!,因为它来自GOODBYE_MSG的定义。表达式$ - HELLO_MSG是标签HELLO_MSG与定义hlen的行之间的字节数。这就是你第一次打电话给print_string打印这两个消息的原因。

请尝试此订单:

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

GOODBYE_MSG db 'Goodbye!',0
glen equ $ - GOODBYE_MSG