汇编 - 在图形模式下打印一个字符
Assembly - Printing a char on graphical mode
我试图在图形模式下打印一个字符。通常当我打印一个字符时我正在做:
mov ah,14 ; ah=14
mov al,'x'
int 10h ; print the character
这次不行了。我想问题是我切换到图形模式:
push ax
mov ah, 0
mov al, 13h
int 10h
pop ax
ret
那么我如何仍然使用图形模式(我需要它)并打印字符?
我正在使用 nasm 编译器、bochs 调试器和 8086 平台。
非常感谢!
手边总是Ralf Brown Interrupt List。
服务 int 10h/AH=0Eh
需要 BH
中的页码和 BL
中要使用的颜色。
此代码段有效
mov ah, 0eh ;0eh = 14
mov al, 'x'
xor bx, bx ;Page number zero
mov bl, 0ch ;Color is red
int 10h
在文本模式下不使用 BL
,但在图形模式下它是。
设置不当可能会变成 "black on black"。
你必须画它(至少如果你想润色它的外观)。
IIRC BIOS 或 DOS 中断其实可以 gfx 模式打印字符,但字体很难看,而且它破坏了周围的其他内容,所以当我确实需要在 13h 模式下打印文本时,我不得不自己做。
如果您是新手,请这样开始:
- 用一些图片创建 6x8 字节数组 ( *1 )
- 绘制它 = 创建 PutSprite(source, width=6, height=8, posx=10, posy=10) 函数
- 创建 6x8 256 色的基本 ASCII 字体(或在互联网上搜索一些固定大小的 asm 字体)
- 创建您自己的 "print" 函数,使用正确的字体字形调用 PutSprite,并为每个字符移动目标坐标。
- (可选)如果你想要比例字体,你必须将每个字形的宽度与字体图形一起存储,并根据它推进位置
- (可选)扩展 PutSprite 以检查定义的透明颜色,例如 255,因此它将仅为非透明像素复制源字节。
*1)
第一步,你可以像这样使用一些调试 gfx(使用默认的 DOS 调色板):
testSprite: ; testing gfx glyph, size 6x8 pixels for 13h mode
times 6 db 15 ; white line at top
times 6*6 db 2 ; dark green middle
times 6 db 13 ; violet line at bottom
在第二步中,您必须将值从源地址复制到 0xA000:320*posy+posx 内存区域,正确推进指针:复制每个字节后的源++,单行的目标++(对于 width 字节),然后 destination+=320-width 前进到下一行 height 行。
我试图在图形模式下打印一个字符。通常当我打印一个字符时我正在做:
mov ah,14 ; ah=14
mov al,'x'
int 10h ; print the character
这次不行了。我想问题是我切换到图形模式:
push ax
mov ah, 0
mov al, 13h
int 10h
pop ax
ret
那么我如何仍然使用图形模式(我需要它)并打印字符? 我正在使用 nasm 编译器、bochs 调试器和 8086 平台。
非常感谢!
手边总是Ralf Brown Interrupt List。
服务 int 10h/AH=0Eh
需要 BH
中的页码和 BL
中要使用的颜色。
此代码段有效
mov ah, 0eh ;0eh = 14
mov al, 'x'
xor bx, bx ;Page number zero
mov bl, 0ch ;Color is red
int 10h
在文本模式下不使用 BL
,但在图形模式下它是。
设置不当可能会变成 "black on black"。
你必须画它(至少如果你想润色它的外观)。
IIRC BIOS 或 DOS 中断其实可以 gfx 模式打印字符,但字体很难看,而且它破坏了周围的其他内容,所以当我确实需要在 13h 模式下打印文本时,我不得不自己做。
如果您是新手,请这样开始:
- 用一些图片创建 6x8 字节数组 ( *1 )
- 绘制它 = 创建 PutSprite(source, width=6, height=8, posx=10, posy=10) 函数
- 创建 6x8 256 色的基本 ASCII 字体(或在互联网上搜索一些固定大小的 asm 字体)
- 创建您自己的 "print" 函数,使用正确的字体字形调用 PutSprite,并为每个字符移动目标坐标。
- (可选)如果你想要比例字体,你必须将每个字形的宽度与字体图形一起存储,并根据它推进位置
- (可选)扩展 PutSprite 以检查定义的透明颜色,例如 255,因此它将仅为非透明像素复制源字节。
*1) 第一步,你可以像这样使用一些调试 gfx(使用默认的 DOS 调色板):
testSprite: ; testing gfx glyph, size 6x8 pixels for 13h mode
times 6 db 15 ; white line at top
times 6*6 db 2 ; dark green middle
times 6 db 13 ; violet line at bottom
在第二步中,您必须将值从源地址复制到 0xA000:320*posy+posx 内存区域,正确推进指针:复制每个字节后的源++,单行的目标++(对于 width 字节),然后 destination+=320-width 前进到下一行 height 行。