2017-05-28 74 views
-2

因此,我开始学习汇编,并正在用FASM编写一个简单的操作系统。我有一个灰色的顶部栏和一个光标的蓝色屏幕,但不能让文本出现在一行上。在第一行,我希望它说“文件系统”,然后在其他行我想要其他的东西。我把这里的代码:如何将文本添加到用汇编编写的操作系统

mov ax, 9ch 
mov ss, ax 
mov sp, 4096d 
mov ax, 7c0h 
mov ds, ax 
;---------------- 


;this sets blue to background 
mov ah, 09h 
mov cx, 1000h 
mov al, 20h 
mov bl, 17h 
int 10h 
;end of blue 

;start of gray top 
mov ah, 09h 
mov cx, 80d 
mov al, 20h 
mov bl, 87h 
int 10h 
;end of gray 
;top bar 






;end of top bar 
;define mouse 
mov ah, 01h 
mov cx, 07h 
int 10h 

mov bl, 5h 
mov cl, 5h 


_mouser: 
mov ah, 02h 
mov dl, bl 
mov dh, cl 
int 10h 

mov ah, 00h 
int 16h 

cmp al, 77h 
je _up 
cmp al, 73h 
je _down 
cmp al, 61h 
je _left 
cmp al, 64h 
je _right 
cmp al, 20h 
je _click 
jmp _mouser 



_click: 
mov ah, 0eh 
mov al, 0b2h 
int 10h 
jmp _mouser 

_up: 
cmp cl, 0h 
je _mouser 
sub cl, 1h 
jmp _mouser 

_down: 
cmp cl, 24d 
je _mouser 
add cl, 1h 
jmp _mouser 

_left: 
cmp bl, 0h 
je _mouser 
sub bl, 1h 
jmp _mouser 

_right: 
cmp bl, 79d 
je _mouser 
add bl, 1h 
jmp _mouser 



;---------------- 
times 510-($-$$) db 0 
dw 0xAA55 

我曾尝试

mov ah, eoh 
mov al, 'F' 
int 10h 

问题是,只能使单个字符的字符串。

+0

'mov啊,0eh; mov al,'F'; int 10h'应该更好。 – Jester

+0

是的,我知道这使得一个字符,但我需要一个字符串 –

+0

去花一些时间阅读维基在http://osdev.org –

回答

3

PC的ROM BIOS提供一组通过中断10h调用的视频服务,包括一些将字符打印到字符串的视频服务。他们的综合文档可以在here找到。

看来你已经发现了服务0Eh,它在当前字符位置向屏幕写入单个字符并且提前字符位置。这将屏幕看作是电传打字(TTY),并使得在屏幕上获得输出变得非常容易。

(至少,它看起来你试图调用服务0EH。您的代码是不正确的。你有mov ah, eoh,这是不正确的。o不是一个十六进制值,即使是为0一个错字,你又啃相反它应该是mov ah, 0Eh

如果你想打印一个字符串(多个字符),你基本上有两种选择:。

  1. 你可以反复调用像0Eh这样的服务,将单个字符写入str每一次。这方面的一个示例实施方式将是:

    mov ah, 0Eh    ; service 0Eh: print char as TTY 
    .PrintNextChar: 
        mov al, BYTE PTR [si] ; get next character in string, pointed to by SI 
        inc si     ; increment pointer 
        test al, al    ; is character == 0 (end-of-string)? 
        je .Done 
        int 10h 
        jmp .PrintNextChar 
    .Done 
    

    此打印从字符串中的字符指向SI直到它到达0(NUL字符),这表示字符串的结束(一个标准的C语言风格NUL-终止的字符串)。

    但是,这种一次打印一字符的方法相对较慢。相反,人们通常更喜欢...

  2. 使用服务1300h或1301h一次打印整个字符串。区别在于服务1301h在打印字符串之后提前光标,而服务1300h不改变光标。否则,他们是一样的。

    这些服务的参数记录在上面的链接中;这里重印了方便:

    • AX == 1300H/1301h
    • BL ==视频属性(在文本模式中,指定的前景和背景颜色)
    • BH ==视频页面(通常为0)
    • CX串起始位置的
    • DL/DH ==列/行的长度==字符串
    • ES:BP

    的开始==地址显然,这需要您知道该字符串提前长度,而把它作为在CX寄存器参数。该字符串由ES:BP指向。

    在你的情况下,打印“文件系统”,你将宣布一个字符数组中包含该字符串的数据段,然后像做:

    MyString DB "FILE SYSTEM" 
    
    mov ax, ds 
    mov es, ax   ; set ES == DS 
    mov bp, MyString 
    mov cx, 11   ; length of string (number of chars) 
    mov bx, 07h   ; foreground & background color (white on black) 
    xor dx, dx   ; starting position (top-left) 
    mov ax, 1301h  ; service 1301h: print string and update cursor 
    int 10h 
    
+0

非常感谢你为我工作! –