3

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

insolor
  • 49,104

2 Answers2

6

Адрес рассчитывается не как сумма регистра сегмента + смещение, а регистр сегмента*16 (сдвинуть на 4 бита влево) и только потом добавить смещение.

Конструкция mov [0B800], ax работать не будет, потому что нужно задать немного другой адрес mov [0B8000], ax, но на 16 битном регистре задать 20 бит нельзя...

Еще раз mov [es:di], ax записывает по адресу es*16+di, а не es+di.

KoVadim
  • 112,121
  • 6
  • 94
  • 160
  • регистр смещения => "регистр сегмента" :) – PinkTux Jul 21 '18 at 16:46
  • ага, пальцы иногда промазывают – KoVadim Jul 21 '18 at 16:51
  • Конструкция mov [0B800], ax работать не будет => будет работать, но не так, как ожидается. Sorry, была неделя в режиме педанта, выползать непросто :) – PinkTux Jul 21 '18 at 18:04
  • "не будет работать" имеет два значения. Не будет компилироваться и не будет делать то, что от нее ожидают – KoVadim Jul 21 '18 at 19:43
0
 mov [0B800], ax

Это - запись по смещению 0B800h в текущем сегменте данных. То есть на что указывает DS, туда и пишется.

use16

А оно точно вам надо? :-)

PinkTux
  • 9,056