Assembly OS-如何在第二行上编写文本?

时间:2018-07-22 16:58:45

标签: assembly x86

我在第一行有文字。我想在第二行写一个文本。但是如何?

这是我的示例代码:

start:
        mov ax, 07C0h
        add ax, 288
        mov ss, ax
        mov sp, 4096
        mov ax, 07C0h
        mov ds, ax

        mov ah, 09h
        mov cx, 1000h
        mov al, 20h
        mov bl, 17h
        int 10h
        mov si, text_string
        call print_string
        jmp $

        text_string db 'This is my Operating System!', 0
print_string:
        mov ah, 0Eh
.repeat:
        lodsb
        cmp al, 0
        je .done
        int 10h
        jmp .repeat
.done:
        ret
        times 510-($-$$) db 0
        dw 0xAA55           

现在,如何在第二行上写文字?

1 个答案:

答案 0 :(得分:1)

要在下一行上打印,请插入回车和换行代码:

    text_string db 'This is my Operating System!', 13, 10
                db '----------------------------', 0

代码13(回车)将光标带回到屏幕的左边缘。
代码10(换行符)使光标下降一行。

但是,如果要在整个屏幕的第二行上打印,则可以使用BIOS功能02h在此处设置光标:

mov dx, 0100h  ; DH=row 1, DL=column 0
mov bh, 0      ; display page
mov ah, 02h    ; SetCursor
int 10h

在标准的80x25屏幕上,列的编号从0到79,行的编号从0到24。


mov ah, 09h
mov cx, 1000h
mov al, 20h
mov bl, 17h
int 10h

关于清晰的屏幕代码:

  • 您忘记在BH寄存器中指定显示页面。使用mov bh, 0
  • CX寄存器中的计数很大。 1000h等于4096,整个屏幕上只有2000个字符单元格(80 * 25)。

我建议你写:

mov cx, 2000
mov bx, 0017h
mov ax, 0920h
int 10h