#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).