当尝试向视频内存(0xb8000)中写入两个字母“ UV”时,将“ UV”打印在屏幕中心附近,而将“ UV”打印在屏幕的左上角,使用GAS AT&T组件在x86实模式下在引导扇区中运行。
使用的命令:
as os1.s -o os1.o;ld os1.o -o os1 -Ttext=0x7c00 --oformat=binary;sudo qemu-system-x86_64 -cpu max -drive format=raw,file=os1
猜测错误与寻址存储器有关。 %bx
应该是保存在存储器scn_pos
中的初始数字0。虽然大约是1000。不知道为什么。
.code16 #! tells the assembler to generate 16-bit code
.globl _start
#.section .data
.section .text
_start:
movw $0x0d55, %ax
call write_screen
movw $0x0d56, %ax
call write_screen
jmp .
write_screen:
push %ds
pushl %ebx
mov $0xb800, %bx #! 0xb800 changes to scn_sel at 32-bit mode
mov %bx,%ds
mov scn_pos, %bx
mov %ax, (%bx) # write to screen
add $2, %bx
cmp $2000, %bx
jb 1f
mov $0, %bx
1: mov %bx, scn_pos
popl %ebx
pop %ds
ret
scn_pos:
.word 0x0 #! needs to be 32-bit at 32-bit mode
.org 510
.word 0xAA55
“ UV”应打印在屏幕的最开始而不是屏幕中心。