Страницы

Поиск по вопросам

пятница, 14 февраля 2020 г.

Пытаюсь выучит ассемблер. Кое-что не особо понятно

#ассемблер


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

Комментариев нет:

Отправить комментарий