assembly - 为什么第二次调用打印函数后输出错误? (x86 组件)

标签 assembly printing boot

我编写了一个由 BIOS 启动的简单汇编程序,并编写了一个将寄存器 (E)SI 的内容输出到屏幕的函数

我有一个名为 msg 的变量,它是一个字符串“Hello World1”、0xa、“Hello World2”、0xa、“Hello World3”、0xa、0xa、0x0

如果我使用该函数一次,输出将是:

Hello World1
Hello World2
Hello World3

但是如果我使用它两次,输出将是这样的:

Hello World1
Hello World2
Hello World3

Hello World1
                          Hello World2
                          Hello World3

为什么我使用打印功能两次会出现错误?

我的代码:


[ORG 0x7c00]

    xor     ax, ax
    mov     ds, ax
    mov     ss, ax
    mov     sp, 0x9c00
    mov     ax, 0xb800
    mov     gs, ax

    call    clear

    mov     si, msg
    mov     ah, 4
    call    print

    mov     si, msg
    mov     ah, 4
    call    print

    cli
    jmp     $

print:
    mov     bx, [vaddr]

write:
    lodsb
    cmp     al, 0
    je      end_write
    cmp     al, 0xa
    je      new_line
    mov     [gs:bx], ax
    add     bx, 2
    jmp     write

new_line:
    mov     cx, [vline]
    add     cx, 160
    mov     [vline], cx
    sub     cx, bx
    add     bx, cx

    jmp write

end_write:
    mov     [vaddr], bx
    ret

clear:
    mov     ah, 0
    mov     al, ' '
    xor     bx, bx

    mov     cx, 2000

clear_char:
    mov     [gs:bx], ax
    add     bx, 2
    loop    clear_char

    mov     byte [vaddr], 0
    mov     byte [vline], 0
    ret

msg:        db      "Hello World1", 0xa, "Hello World2", 0xa, "Hello World3", 0xa, 0xa, 0x0
vaddr:      db      0x0
vline:      dd      0

    times 510-($-$$) db 0
    db 0x55
    db 0xAA

感谢您的帮助

最佳答案

这些变量的定义:

vaddr:      db      0x0             BYTE
vline:      dd      0               DWORD

这些变量的设置:

mov     byte [vaddr], 0             BYTE
mov     byte [vline], 0             BYTE

这些变量的使用:

mov     bx, [vaddr]                 WORD
mov     cx, [vline]                 WORD 

只需确保在任何地方都使用WORD!

关于assembly - 为什么第二次调用打印函数后输出错误? (x86 组件),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50540913/

相关文章:

linux部署,kali,启动后启动应用程序服务

gcc - GCC 内置向量化类型和 C 数组之间有什么区别?

python - 保护 python 代码免受逆向工程

java - 打印 Java 数组的最简单方法是什么?

python - 打印两个字符串之间没有换行符

centos - centos 8如何安装uboot工具

linux - Buildroot - 系统不启动 -/dev/ttyS0 没有这样的文件

opencv - 优化SIMD直方图计算

assembly - 将 float 移动到 mips 中的新寄存器的最佳方法?

android - 从服务器 URL 打印 pdf