assembly - 在传统 BIOS 引导加载程序中打印特殊(非拉丁)字符

标签 assembly nasm x86-16 bootloader codepages

我正在制作一个简单的 Bootstrap 。我想在屏幕上打印一些非拉丁文字,但无法正确打印字符“ü”。如何让我的操作系统打印 ü 之类的字符?我已经搜索过它,但找不到任何相关信息。

主.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 作为汇编程序。

最佳答案

您用来编写源文本的编辑器可能不会将字符“ü”的 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

关于assembly - 在传统 BIOS 引导加载程序中打印特殊(非拉丁)字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66904170/

相关文章:

assembly - 在 SAR 与 SHR 的汇编中将二进制数向右移动

assembly - XCHG 在 8086 处理器中是如何实现的?

windows - "66:PUSH 08"中的66代表什么?

c++ - Visual Studio C++ : Seeing the ASM code?

c++ - g++ 4.6.1 编译器错误 : Error: unknown pseudo-op: `.cfi_personality'

c - 如何通过编程语言实现多重处理?

linux - 奇怪的 Nasm 错误 : invalid combination of opcode and operands

linux - NASM x86_64 在编写命令行参数时遇到问题,在 rax 中返回 -14

assembly - x86除法异常返回地址

linux - 汇编代码程序发生段错误