#ассемблер
Взял пример из книги (Олега Калашникова "Ассемблер это просто"), который записывает
символ в видео буфер DOS по адресу B800h и смещению 0 (Код должен выводить ASCII символ
смайлика в углу текстового экрана). Сассемблировал код в FASM. (Естественно изменив
его под синтаксис FASM)
Вот код:
use16
org 100h
mov ax, 0B800h
mov es, ax
mov di, 0h
mov ah, 31
mov al, 1
mov [es:di], ax
mov ah, 10h
int 16h
int 20h
Если я обращаюсь к нулевому смещению по адресу B800, то значит, обращение прямо идет
на этот же адрес.
Но попробовав заменить mov [es:di], ax на это: mov [0B800], ax. У меня символ не
появился, как с первым кодом. Почему так?
Ответы
Ответ 1
Адрес рассчитывается не как сумма регистра сегмента + смещение, а регистр сегмента*16 (сдвинуть на 4 бита влево) и только потом добавить смещение. Конструкция mov [0B800], ax работать не будет, потому что нужно задать немного другой адрес mov [0B8000], ax, но на 16 битном регистре задать 20 бит нельзя... Еще раз mov [es:di], ax записывает по адресу es*16+di, а не es+di.Ответ 2
mov [0B800], ax Это - запись по смещению 0B800h в текущем сегменте данных. То есть на что указывает DS, туда и пишется. use16 А оно точно вам надо? :-)
Комментариев нет:
Отправить комментарий