我们之前在屏幕上输出数据的时候下标总是在前面,如何解决光标一直在前面的问题呢?
想要控制光标位置,我们需要两个指令--输入输出指令来控制硬件
in指令 ---------------------------- out指令
想要控制硬件,我们还需要往对应的端口上写上数据
这里介绍2个端口
一个是CRT 地址端口 0x3D4
一个是CRT 数据端口 0x3D5
0x0E 是光标位置的高八位
0x0F是光标位置的低八位
代码如下:
[org 0x7c00] ;标识程序从0x7c00开始
CRT_ADDR_REG equ 0x3D4
CRT_DATA_REG equ 0x3D5
CRT_CURSOR_HIGH equ 0x0E
CRT_CURSOR_LOW equ 0x0F
mov ax,3 ;清空屏幕
int 0x10
mov ax,0
mov ds,ax
mov ss,ax
mov sp,0x7c00
xchg bx,bx ;下断点
mov ax,0xb800
mov es,ax
mov si,message
mov di,0
print:
call get_cursor
mov di,ax
shl di,1
mov bl,[si]
cmp bl,0
jz print_end
mov [es:di],bl
inc si
inc ax
call set_currsor
jmp print
print_end:
halt:
hlt
jmp halt
get_cursor: ;获取光标位置
push bx
mov dx,CRT_ADDR_REG
mov al,CRT_CURSOR_HIGH
out dx,al
mov dx,CRT_DATA_REG
in al,dx
shl ax,8
mov dx,CRT_ADDR_REG
mov al,CRT_CURSOR_LOW
out dx,al
mov dx,CRT_DATA_REG
in al,dx
pop bx
ret
set_currsor: ;设置光标位置
push dx
push bx
mov bx,ax
mov dx,CRT_ADDR_REG
mov al,CRT_CURSOR_LOW
out dx,al
mov dx,CRT_DATA_REG
mov al,bl
out dx,al
mov dx,CRT_ADDR_REG
mov al,CRT_CURSOR_HIGH
out dx,al
mov dx,CRT_DATA_REG
mov al,bh
out dx,al
pop bx
pop dx
ret
message:
db "hello,world!!!",0
times 510 - ($-$$) db 0
db 0x55, 0xaa
最终效果如下: