Как я могу найти буфер страницы текстового режима в TASM?

#assembly #dos #x86-16 #bios #tasm

#сборка #dos #x86-16 #bios #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
 

Ответ №1:

Проблема заключается в вычислении сегмента. Если вы находитесь в текстовом режиме 80×25, размер каждой текстовой страницы составляет 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 для изменения видеостраниц вы можете определить количество байтов, которые занимает каждая видеостраница, посмотрев на 16-битное значение СЛОВА по адресу памяти 0000h: 044ch в области данных BIOS (BDA). Вы можете прочитать это значение и сдвинуть его вправо на 4 бита, а затем добавить его к базовому видеоадресу (0b800h в случае видеорежима 03h).