【问题标题】:How can I find text mode page buffer in TASM?如何在 TASM 中找到文本模式页面缓冲区?
【发布时间】:2021-03-27 07:47:36
【问题描述】:

我正在尝试通过其内存地址将一些字符发送到文本模式的第 1 页,但我没有找到合适的结果,我计算了第 1 页的地址,如“0B800h + 1000h = 0C800h”。

这是我的代码:

        IDEAL

        MODEL   small
        STACK   256

        DATASEG


exCode          DB      0
x_var           db      219


        CODESEG


Start:  
        mov     ax, @data       ; Initialize DS to address
        mov     ds, ax          ;  of data segment
        

        ; Page 1
        mov     ax, 0501h
        int     10h

        ;Page 1 buffer -> es
        mov     ax, 0C800h
        mov     es, ax
        
        mov     si, offset x_var

        mov     di, (10*80*2)+(10*2)

        cld

        lodsb
        stosb

        ; wait for any key press: 
        mov ah, 0
        int 16h

        ;Page 0 again
        mov     ax, 0500h
        int     10h


Exit:
        mov     ah, 04Ch        ; DOS function: Exit program
        mov     al, [exCode]    ; Return exit code value
        int     21h             ; Call DOS.  Terminate program

        END     Start           ; End of program / entry point

【问题讨论】:

    标签: assembly dos x86-16 bios tasm


    【解决方案1】:

    问题在于段的计算。如果您处于 80x25 文本模式,则每个文本页的大小为 4096 字节 (01000h)。您不能将 01000h 添加到 0b800h。您需要将 01000h 右移 4 位(或除以十进制数 16)以将该值转换为 16 字节段落的数量,然后将其添加到 0b800h 段值。 01000h 右移 4 位是 0100h。将其添加到 0b800h,您将获得 0b900h (0b800h+0100h) 作为第 1 页开始的段。因此:

    mov     ax, 0C800h
    mov     es, ax
    

    应该是:

    mov     ax, 0B900h
    mov     es, ax
    

    注意事项

    • 当使用 BIOS 更改视频页面时,您可以通过查看 BIOS Data Area (BDA) 中内存地址 0000h:044ch 处的 16 位 WORD 值来确定每个视频页面占用的字节数。您可以读取该值并将其右移 4 位,然后将其添加到基本视频地址(在视频模式 03h 的情况下为 0b800h)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-26
      • 2013-10-25
      • 2020-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多