【问题标题】:When printing characters, how do I change where I'm printing (printing all bytes on same spot)?打印字符时,如何更改打印位置(在同一位置打印所有字节)?
【发布时间】:2018-02-12 23:07:29
【问题描述】:

我需要逐字节进行(我不能只打印字符串,在 dx 中使用偏移等级)而且我在任何地方都找不到我需要的东西,大多数人只是使用打印字符串,所以在我打印之后一个字符,我如何移动到dosbox中的下一个方块?它把它们都打印在同一个地方,所以它只显示最后一个数字......

IDEAL
MODEL small
STACK 100h
DATASEG
grades db '90 91 92 93 94 95 96 97 98'
CODESEG
start:
    mov ax, @data
    mov ds, ax
    mov cx, 26
    mov ah, 09h 
    mov bh, 0   
    mov si, 0
printcolor: 
    mov bl, 00000010b
    mov al, [grades + si]
    push cx
    mov cx, 1
    int 10h
    pop cx
    inc si
    loop printcolor
exit:
    mov ax, 4c00h
    int 21h
END start

【问题讨论】:

  • stanislavs.org/helppc/int_10.html - 09 是“在光标处写入字符”,因此请检查“2 - 设置光标位置”...或检查 EGA/VGA 文本模式如何组织内存并直接写入 @ 987654323@区。

标签: assembly x86-16 tasm dosbox


【解决方案1】:

BIOS 功能 09h 不会使光标前进。

  1. 如果您真的不需要黑底绿字,那么您可以使用 Teletype 函数 0Eh 来轻松解决问题。

     mov  cx, 26 
     mov  bh, 0   
     mov  si, 0
    printcolor: 
     mov  bl, 00000010b
     mov  al, [grades + si]
     mov  ah, 0Eh
     int  10h
     inc  si
     loop printcolor
    
  2. 如果您确实坚持黑底绿,那么请同时使用这两个功能。函数 09h 将提供所需的颜色,函数 0Eh 将提供光标前进。

     mov  bh, 0   
     mov  cx, 1
     mov  si, 0
    printcolor: 
     mov  bl, 00000010b
     mov  al, [grades + si]
     mov  ah, 09h
     int  10h
     mov  ah, 0Eh
     int  10h
     inc  si
     cmp  si, 26
     jb   printcolor
    

    请注意,在第二个示例中,我通过使用 SI 中的偏移量来确定是否处理了 26 个字符,从而避免了 CX 的双重使用(从而消除了 pushpop)。

【讨论】:

    猜你喜欢
    • 2017-04-08
    • 2016-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-05
    • 2019-07-06
    • 2020-12-24
    • 2011-03-29
    相关资源
    最近更新 更多