装配 - 在图形模式下打印字符

时间:2016-06-27 11:07:26

标签: assembly nasm x86-16 bochs

我试图在图形模式下打印角色。通常当我打印一个角色时,我正在做:

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平台。

非常感谢!

2 个答案:

答案 0 :(得分:7)

始终拥有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,但在图形模式下,它是 没有正确设置它可能最终写“黑色黑色”。

答案 1 :(得分:0)

你必须绘制它(至少如果你想要抛光它的外观)。

IIRC BIOS或DOS中断实际上能够以gfx模式打印字符,但字体很难看,它确实破坏了其他内容,所以当我确实需要在13h模式下打印文本时,我不得不这样做靠我自己。

如果您是新手,请从这样开始:

  1. 使用一些图片(* 1)
  2. 创建6x8字节数组
  3. draw it = create PutSprite(source,width = 6,height = 8,posx = 10,posy = 10)function
  4. 以6x8 256色创建基本ASCII字体(或搜索某些固定大小的asm字体的互联网)
  5. 创建您自己的“print”函数,使用正确的字体字形调用PutSprite,并为每个字符移动目标坐标。
  6. (可选)如果你想拥有比例字体,你必须将每个字形的宽度与字体图形一起存储,并根据它来提前位置
  7. (可选)扩展PutSprite以检查定义的透明度颜色,例如255,因此它将仅为非透明像素复制源字节。
  8. * 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 字节),然后目的地+ = 320-宽度前进到高度线的下一行。