大概意思就是屏幕上显示字符串,是依靠 显示缓冲区(0x800b_8000,实际的物理地址为0x000b_8000)的。
.roll_screen:
cmp bx,2000 ;光标超出屏幕?滚屏
jl .set_cursor
cld
mov esi,0x800b80a0 ;小心! 32 位模式下 movsb/w/d
mov edi,0x800b8000 ;使用的是 esi/edi/ecx
mov ecx,1920
rep movsd
mov bx,3840 ;清除屏幕最底一行
mov ecx,80 ;32 位程序应该使用 ECX
如上图,为实现屏幕上滚的汇编。其实就是把0x800b_80a0处的东西,复制到0x800b_8000处。
虽然上面这些东西不是书里的重要内容。但还是有几个问题,想问一下:
- 我理解 屏幕上滚,就是 屏幕现在只能显示到 字符串的后半段,前半段 屏幕装不下了,所以需要 有回滚操作。对吧?
-
为什么上面这个 copy 动作,就可以实现 上滚?
- 是屏幕上 始终只显示
0x800b8000开始的 n 字节的字符串吗?所以就需要 copy 到这个特定位置。
- 是屏幕上 始终只显示
- 这么直接 copy 不会直接 覆盖到别的字符串吗?
或者说,这个“上滚”我是不是理解反了。屏幕刚开始是 显示的是开始的内容,然后屏幕往上动,然后人就看到了 后面的内容。