当前位置: 代码迷 >> 汇编语言 >> 32位保护模式下移动光标位置,该如何解决
  详细解决方案

32位保护模式下移动光标位置,该如何解决

热度:143   发布时间:2016-05-02 04:37:00.0
32位保护模式下移动光标位置
16位下可以调用BIOS中断改变光标位置,32位下如何才能改变光标位置?
------解决方案--------------------
如果楼主是用汇编的话可以直接用in和out指令直接访问存放光标位置的端口就好了

mov dx,03d4h;03d4h是索引端口
mov al,0eh;内部的0eh位置存放着光标位置的高八位
out dx,al
inc dx;03d5h是数据端口用于读写数据
in al,dx;读取光标的高八位并且放入bh
mov bh,al

dec dx;这儿开始读取光标位置的低八位放入bl
mov al,0fh;0fh位置存放着光标位置的低八位
out  dx,al
inc dx
in al,dx
mov bl,al

inc bx;改变光标位置,这儿将光标推进一个位置

mov  dx,03d4h;这段代码将改变后的光标位置写入端口内相应的地方以便下次访问
mov al,0eh;写入光标位置高八位
out dx,al
inc dx
mov al,bh
out dx,al

dec dx
mov al,ofh;写入光标位置低八位
out dx,al
inc dx
mov al,bl
out dx
;光标的位置从0开始编号在一页的文本模式下最大可以到1999因为一页也就可以显示25*80=2000个字符
因此一个光标位置代表的是文本模式下的两个字节包括了低字节的asc码和高字节的字符属性,因此用光标
在文本模式下进行显示位置跟进的时候别忘了将光标位置乘2,比如说光标位置为2代表的就是文本模式下的第
三个字符,想在这儿显示一个字符就需要bx*2=4 刚好等于第三个字符的起始位置,由于光标位置的变动需要自己跟进
它不会自动跟进因此你还要在显示后将bx+1以便指向下一个显示位置,此时你需要 bx除以2 再加1,为了避免频繁的使用
乘除法可以这样 shl bx,1   然后显示字符  完了以后 shr bx,1  inc bx 然后去重置光标位置。至于光标位置超过一页范围的可以
自行采用自己的办法处理