如何使用 16h BIOS 显示符号

How to show symbol with 16h BIOS

提问人:Bimbowka 提问时间:11/13/2023 最后编辑:Bimbowka 更新时间:11/13/2023 访问量:46

问:

该程序必须获取并显示符号。但相反,我有这一系列奇怪的奇怪符号 组织 100h

org 100h

section .text
_start:
    
    mov ah, 0     
    int 16h         

    mov [znak], al

    mov ah, 9   
    mov dx, znak     
    int 21h        

    mov ah, 4Ch         
    int 21h         

section .data
    znak db 0        

Output

我试图更改语法,但它不起作用,或者我只是看不到

组装 x86 键盘 NASM

评论

3赞 dimich 11/13/2023
int 21h 的函数 9h 期望字符串以 .$

答:

3赞 Sep Roland 11/13/2023 #1

而不是使用 DOS。PrintString 函数 09h(要求字符串以 $ 字符结尾),请使用 DOS。PrintCharacter 函数 02h:

mov  ah, 00h   ; BIOS.GetKeystroke
int  16h       ; -> AX
mov  dl, al
mov  ah, 02h   ; DOS.PrintCharacter     
int  21h       ; -> (AL)
mov  ax, 4C00h ; DOS.Terminate        
int  21h

仍然想使用DOS。PrintString 函数 09h?
然后

  • 确保设置 DS 段寄存器
  • 以 $ 字符终止字符串
    mov  ax, @data
    mov  ds, ax
    mov  ah, 00h   ; BIOS.GetKeystroke
    int  16h       ; -> AX
    mov  [znak], al
    mov  dx, znak
    mov  ah, 09h   ; DOS.PrintString     
    int  21h       ; -> (AL)
    mov  ax, 4C00h ; DOS.Terminate        
    int  21h

section .data
    znak db 0, '$'

评论

2赞 dimich 11/13/2023
看起来 OP 编译成 .com 文件 ()。对于 .com 文件,段寄存器在启动时已初始化。.org 100h
2赞 Sep Roland 11/13/2023
@dimich 你是对的!我忽略了这一点.无论如何,如果他们使用的是 .COM,我宁愿他们根本不提及这些。org 100hsection .text_start:section .data
2赞 dimich 11/13/2023
是的。我对 nasm 语法不是很熟悉,但对于 tasm,我从未使用过代码/数据段分离来表示内存模型很小。刚刚使用 nasm 编译,有和没有部分定义 - 除了对齐之外没有区别。