如何在文本模式程序集中转到新行

How to go to new line in text mode assembly

我目前正在制作自己的操作系统。由于我将在某个时候进入 32 位模式,因此我将需要不间断地打印到屏幕,因为它们将不存在。

到目前为止,这是我的代码:

org 0x7c00            ; add to offsets
xor ax, ax            ; make it zero
mov ds, ax            ; ds=0
mov ss, ax            ; stack starts at 0

cld

mov ax, 0xB800        ; Ax = address of video memory
mov es, ax
xor di, di


mov si, msg         ; load msg into si
call print            ; call thr print function

hlt

print:
  mov ah, 07h

printchar:
  lodsb               ; Hear we load a letter from si
  stosw
  cmp al, 0
  je done
  jmp printchar

done:
  ret                 ; return





msg db "Hello, World", 0   ; msg = 'test'
xpos   db 0
ypos   db 0


times 510-($-$$) db 0 ; make sure file is 510 bytes in size
dw 0xaa55             ; write boot signiture

在查看documentation时,我知道要设置字符的位置,我必须得到position = (y_position * characters_per_line) + x_position;

唯一的问题是,它似乎不起作用。即使我在地址中加一使其成为 0xB801,它也不会将文本移动一个字符。相反,我得到这个:.

这是怎么回事?我要如何在新行上打印一个字符并将 x 位置递增 1?

VGA文本模式下的字符为2个字节;一种用于角色,一种用于属性。 +1 字节不是字符的开始。

但是你不是在地址上加 1,而是在段基数 (0xB801) 上加 1,所以你要相对于 0,0 向前移动 16 个字节或 8 个字符VGA 内存起始位置,线性地址 0xB8000。

前一个字符为 add di,2,因为您当前的代码使用 es:di 存储到 VGA 内存中。 (或者从 mov di,2 开始,而不是将其归零。)

如果切换到具有平面 32 位地址的 32 位保护模式,则不必处理分段 space。您现在没有使用任何 BIOS 调用,所以您可以。