assembly – 使用DOS或BIOS显示字符
透过
Ralph Brown’s interrupt list,
?我发现有很多不同的方法可以将文本字符输出到屏幕上. ROM BIOS API提供以下功能: > AH = 09h – 在光标位置写字符和属性 DOS API提供以下功能: > AH = 02h – 将字符写入标准输出 这些功能有什么作用?我怎么称呼他们?我如何在它们之间做出选择? 解决方法
所有前面提到的功能在它们完成的任务中都是独一无二的,但是
?起初,丰富似乎有些夸大其词. > Int 21h AH = 02h Write Character To Standard Output 选择哪个功能完全取决于你是什么类型的程序 控制台应用程序: >不关心使用颜色 面向屏幕的应用程序: >使用适量的颜色极大地受益 控制台应用 只有DOS输出功能提供所需/推荐的redirection ; IN (ds:si) OUT () WriteStringDOS: pusha jmps .b .a: mov dl,al mov ah,02h int 21h ;DOS.DisplayCharacter -> AL .b: lodsb test al,al jnz .a popa ret 但有时你会想要显示一个临时项目,如: >某种提示(“ – 更多 – ”,“准备好时按键……”等) 为了避免弄乱任何重定向输出,最好不要使用DOS 全屏应用程序 现在输出重定向是你的敌人,所以不要使用任何DOS输出函数. ; IN (ds:si) OUT () WriteStringBIOS: pusha mov bx,0007h ;Display page 0,Color if graphics mode jmps .b .a: cmp al,9 je .Tab mov ah,0Eh int 10h ;BIOS.Teletype .b: lodsb test al,al jnz .a popa ret .Tab: mov ax,0E20h ;Start displaying space(s) int 10h ;BIOS.Teletype mov ah,03h int 10h ;BIOS.GetCursor -> CX DX test dl,7 jnz .Tab ;Column not yet multiple of 8 jmps .b 大多数时候,一点颜色会产生奇迹.以下代码片段使用 在文本视频模式下使用第一个: ; IN (bl,ds:si) OUT () WriteStringWithAttributeTVM: pusha mov bh,0 ;Display page 0 jmps .d .a: cmp al,9 je .Tab cmp al,13 ja .b mov cx,1101_1010_0111_1111b bt cx,ax jnc .c ;7,8,10,13 don't need the color .b: mov cx,1 mov ah,09h int 10h ;BIOS.WriteCharacterAndAttribute .c: mov ah,0Eh int 10h ;BIOS.Teletype .d: lodsb test al,al jnz .a popa ret .Tab: mov cx,1 ;Start displaying colored space(s) mov ax,0920h ;ASCII 20h is space character int 10h ;BIOS.WriteCharacterAndAttribute mov ah,0Eh int 10h ;BIOS.Teletype mov ah,7 jnz .Tab ;Column not yet multiple of 8 jmps .d 使用16色彩色图形视频模式中的第二个.它涉及的更多一点 ; IN (bl,ds:si) OUT () WriteStringWithAttributeGVM: pusha mov bh,0 ;Display page 0 mov bp,bx jmps .d .a: cmp al,13 don't need the color .b: push ax mov cx,1 mov bx,bp shr bl,4 ;Get background color (high nibble) mov ax,09DBh ;ASCII DBh is full block character int 10h ;BIOS.WriteCharacterAndAttribute xor bx,bp ;Anticipate upcoming 'xor' and bl,15 ;Get foreground color (low nibble) or bl,128 ;Have BIOS 'xor' it pop ax .c: mov ah,1 ;Start displaying colored space(s) mov bx,4 ;Get background color mov ax,0EDBh ;ASCII DBh is full block character int 10h ;BIOS.Teletype mov ah,7 jnz .Tab ;Column not yet multiple of 8 jmps .d 综上所述 >对于控制台应用程序WriteStringDOS和WriteStringBIOS 1长延迟功能请求:使光标前进?接收复制计数为零.2 Retorical,而不是一个实际的问题.3除非您选择BIOS没有TTY的视频模式支持.例如.在VESA视频模式下,许多BIOS无法滚动.我甚至来了在传统图形视频模式12h上,无法用功能09h写入字符的BIOS!4可以直接在视频存储器中写入,但需要更多努力. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |