在NASM旁边内存彼此标签是造成打印问题在NASM旁边内存彼此标签是造成打印问题(In NASM l

2019-05-12 10:05发布

我有一个问题,而在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

BUGS:

  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

Answer 1:

你的计算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


文章来源: In NASM labels next to each other in memory are causing printing issues