#ассемблер
Взял пример из книги (Олега Калашникова "Ассемблер это просто"), который записывает символ в видео буфер 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 А оно точно вам надо? :-)
Комментариев нет:
Отправить комментарий