【问题标题】:Printing special (non-Latin) characters in a legacy-BIOS bootloader在旧版 BIOS 引导加载程序中打印特殊(非拉丁)字符
【发布时间】:2021-06-28 10:21:15
【问题描述】:

我正在制作一个简单的引导加载程序。我想在屏幕上打印一些非拉丁文本,但无法正确打印字符“ü”。如何让我的操作系统打印像ü 这样的字符?我已经搜索过它,但我找不到任何关于它的信息。

main.asm

[org 0x7c00]

call clear
mov bx, SELAM
call print
call print_nl
mov bx, NABER
call print

jmp $

%include "print.asm"

SELAM:
    db 'Selamun Aleyküm.', 0
NABER:
    db 'Nabün?', 0

times 510 - ($-$$) db 0
dw 0xaa55 

打印.asm

print:
    pusha

start:
    mov al, [bx]
    cmp al, 0 
    je done

    mov ah, 0x0e
    int 0x10
    
    add bx, 1
    jmp start

done:
    popa
    ret



print_nl:
    pusha
    
    mov ah, 0x0e
    mov al, 0x0a
    int 0x10
    mov al, 0x0d
    int 0x10
    
    popa
    ret

clear:
    pusha
    mov ah, 0x00
    mov al, 0x03
    int 0x10
    popa
    ret

我使用 NASM 作为汇编器。

【问题讨论】:

    标签: assembly nasm x86-16 bootloader codepages


    【解决方案1】:

    您用于编写源文本的编辑器可能不会将字符“ü”的 ASCII 代码映射到数字 129。但是执行引导加载程序的计算机将使用代码页 437(在启动时),因此需要129 显示“ü”。

    您可以像这样在文本中手动插入正确的 ASCII 码:

    SELAM:
        db 'Selamun Aleyk', 129, 'm.', 0
    NABER:
        db 'Nab', 129, 'n?', 0
    

    还有一个大写的“Ü”:

    SELAM:
        db 'SELAMUN ALEYK', 154, 'M.', 0
    NABER:
        db 'NAB', 154, 'N?', 0
    

    【讨论】:

      【解决方案2】:

      几乎所有与 IBM 兼容的计算机都使用代码页 437 来生成文本,我猜您必须手动创建某种查找表。

      https://en.wikipedia.org/wiki/Code_page_437

      【讨论】:

      • 在 Linux 上,您可以为此使用 echo äöü | iconv -t 437 | hd
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-20
      • 2013-05-05
      • 2018-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多