我制作了简单的代码,应该写入VGA内存。
org 07c00h
mov eax,0xb8000
mov bx,msg
call printstr
printstr:
mov al,byte[bx]
mov byte[eax],al
inc eax
mov byte[eax],1
inc eax
inc bx
cmp byte[bx],0
je end
jmp printstr
end:
jmp end
msg: db "Hello world!",0
times 510-($-$$) db 0
dw 0xaa55
但不是写#34; Hello world"当我在QEMU中运行时,它会这样做。 我用NASM组装了这个。 Image
我想在第一行覆盖前12个字符" Hello world!"。
有人知道为什么它会给我这个结果吗?
答案 0 :(得分:3)
mov al,byte[bx]
mov byte[eax],al
al
是eax
的一部分,因此通过将一个字符读入al
,您就会丢弃屏幕指针。
除此之外,您不应该在引导加载程序中使用分段寻址吗?像这样:
push 0xb800
pop es
xor di,di
cld
...
stosb ; [es:di] = al, di++