Как найти буфер страницы в текстовом режиме в 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
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
0
125
1
Перейти к ответу Данный вопрос помечен как решенный

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

Другие вопросы по теме