gpt4 book ai didi

assembly - 用 DOS 或 BIOS 显示字符

转载 作者:行者123 更新时间:2023-12-04 16:50:57 25 4
gpt4 key购买 nike

翻阅 Ralph Brown's interrupt list ,
我发现有很多不同的方法可以将文本字符输出到屏幕上。

ROM BIOS API 提供以下功能:

  • AH=09h – 在光标位置写入字符和属性
  • AH=0Ah – 仅在光标位置写入字符
  • AH=0Eh – 电传输出
  • AH=13h – 写字符串

  • DOS API 提供以下功能:
  • AH=02h – 将字符写入标准输出
  • AH=06h – 直接控制台输出
  • AH=09h – 将字符串写入标准输出

  • 这些功能有什么作用?我怎么称呼他们?我该如何在它们之间做出选择?

    最佳答案

    所有上述功能在它们完成的方面都是独一无二的,但是
    乍一看,丰度确实有些夸张。

  • 整数 21 小时 AH=02 小时 Write Character To Standard Output
    此函数解释字符代码 7 (Beep), 8 (Backspace), 9 (Tab),
    10(换行)和 13(回车)。所有其他字符代码都是
    显示。
    Backspace 是非破坏性的,意味着光标移动一个位置到
    没有擦掉下面的东西就离开了。退格在左边缘停止
    屏幕的。
    此功能可扩展选项卡。标签扩展是替换的过程
    ASCII 9 由一系列一个或多个空格 (ASCII 32) 组成,直到光标到达
    8 的倍数的列位置。
    Linefeed 将光标向下移动一行,必要时滚动屏幕。
    回车将光标移动到屏幕的最左侧。
  • 整数 21 小时 AH=06 小时 Direct Console Output
    与功能 02h 非常相似,但不太适合一般用途,因为它是
    无法输出字符 255。仅供引用 FAT 文件名中的合法字符。
    它似乎只是为了避免 ctrlC/
    ctrlBreak 检查。
  • 整数 21 小时 AH=09 小时 Write String To Standard Output
    函数 02h 的字符串版本,但无法输出字符
    36 因为那个被用作字符串终止符。这是一个主要的缺点
    由于字符 36 ( $ ) 不仅是众所周知的货币符号,而且
    FAT 文件名中的合法字符。
  • 整数 21 小时 AH=40 小时 Write To File Or Device
    当与预定义的句柄 1 一起使用时,此函数输出到 STDOUT
    默认为屏幕。所以这是显示的另一种可能性
    人物。但是请注意,它不依赖于字符串终止
    字符而不是长度。当然是最全的输出功能了。
    它解释了需要解释的东西,它不排除某些
    字符,它允许捕获重定向错误,尽管后者涉及使用 Int 24h handler .
  • 整数 10 小时 AH=09 小时 Write Character And Attribute At Cursor Position
    没有任何字符代码被解释,它们都显示在屏幕上。
    在文本模式下,提供的属性字节同时产生前景和
    背景颜色,但在图形模式下,您只能获得前景色。
    光标位置不变。遗憾! 1
  • Int 10h AH=0Ah Write Character Only At Cursor Position
    与文本模式下的函数 09h 类似,但省略了属性字节。
    在图形模式下,此功能与功能 09h 相同。
  • Int 10h AH=0Eh Teletype Output
    此函数解释字符代码 7 (Beep), 8 (Backspace),
    10(换行)和 13(回车)。所有其他字符代码都是
    显示。太糟糕了,这个功能不能扩展标签!
  • 整数 10 小时 AH=13 小时 Write String
    在某种程度上,这是函数 0Eh 的字符串版本。然而对于
    一般使用缺乏标签扩展肯定是一个限制。
    为什么有这么多参数? 2


  • 选择哪个功能然后完全取决于你是什么类型的程序
    写作。基本上可以在控制台应用程序和完整的应用程序之间进行选择
    屏幕应用。 CHKDSK.EXE 或 TREE.COM 等工具是控制台应用程序。
    QBASIC.EXE 或 NE.COM 等程序是全屏应用程序。

    控制台应用程序:
  • 不在乎使用颜色
  • 以线性方式将其输出写在屏幕上
  • 不妨碍操作系统的输出重定向功能
  • 通常执行单个任务
  • 往往一眨眼就结束

  • 面向屏幕的应用程序:
  • 使用适量的颜色会大大受益
  • 在屏幕上徘徊并在它想要的地方写下它想要的
  • 不需要担心输出重定向,因为上面很快就会
    使此类输出不可读
  • 经常执行(太多)任务
  • 一直持续到您决定是时候退出


  • 控制台应用程序

    只有 DOS 输出函数提供所需/推荐的 redirection
    能力。输出功能02h完善。即使它没有自己的错误
    在输出时报告何时应该发生错误(非常不可能)
    重定向, "Abort, Retry, Fail?" 的默认严重错误消息
    看起来并不过分。 (如果这是一个全屏应用程序,
    同样的消息会极大地破坏屏幕。)
    ; 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
    这些临时项目的输出函数。更好地使用 WriteStringBIOS
    接下来的代码。

    全屏应用

    现在输出重定向是你的敌人,所以不要使用任何 DOS 输出功能。
    如果您不需要颜色,那么下一个代码片段适合您。它基本上
    向 BIOS Teletype 功能添加选项卡扩展。
    ; 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

    大多数时候一点颜色会产生奇迹。以下代码片段使用
    BIOS 函数 09h 用于输出彩色字符和 BIOS 函数 0Eh 到
    前进光标。一个很好的组合,让事情变得简单。

    在文本视频模式下使用第一个:
    ; 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,03h
    int 10h ;BIOS.GetCursor -> CX DX
    test dl,7
    jnz .Tab ;Column not yet multiple of 8
    jmps .d

    使用 16 色图形视频模式中的第二个。有点复杂
    因为 BIOS 拒绝绘制背景颜色。
    ; IN (bl,ds:si) OUT ()
    WriteStringWithAttributeGVM:
    pusha
    mov bh,0 ;Display page 0
    mov bp,bx
    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: 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,0Eh
    int 10h ;BIOS.Teletype
    .d: lodsb
    test al,al
    jnz .a
    popa
    ret
    .Tab: mov cx,1 ;Start displaying colored space(s)
    mov bx,bp
    shr bl,4 ;Get background color
    mov ax,0EDBh ;ASCII DBh is full block character
    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 .d

    总之
  • 对于控制台应用程序,WriteStringDOS 和 WriteStringBIOS
    程序绰绰有余3。
  • 对于全屏应用程序,WriteStringWithAttributeTVM 和
    WriteStringWithAttributeGVM 程序同样deliver3
    4.
  • DOS 和 BIOS 都没有足够的能力来处理图形视频
    模式。要么编写自己的图形例程(不是一项微不足道的任务!),要么使用
    第 3 方图形库。

  • 1 长延迟功能请求:使光标前进
    接收复制计数为零。
    2 反驳,而不是实际问题。
    3 除非您选择 BIOS 没有 TTY 的视频模式
    支持。例如。许多 BIOS 在 VESA 视频模式下无法滚动。我什至来过
    在传统图形视频模式 12h 上无法使用功能 09h 写入字符的 BIOS!
    4 直接写入视频内存是可能的,但需要更多
    努力。

    关于assembly - 用 DOS 或 BIOS 显示字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44747002/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com