我如何在 TASM 中找到文本模式页面缓冲区?

How can I find text mode page buffer in TASM?

我试图通过它的内存地址将一些字符发送到文本模式的第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

问题出在段的计算上。如果您处于 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)。