Я пытаюсь отправить некоторые символы на страницу 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