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