如何在文本模式程序集中转到新行
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 调用,所以您可以。
我目前正在制作自己的操作系统。由于我将在某个时候进入 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 调用,所以您可以。