для генерации кода команды компилятору необходимо четко знать размер операнда
в данном случае мы имеем дело с косвенной адресацией, т.е. адрес операнда содержится в регистре
mov [bx],ax - поместить значение регистра AX по адресу, который содержится в регистре BX
здесь размер операнда известен (разрядность AX = 16 бит), поэтому будет сгенерирована команда для записи слова
рассмотрим такой пример:
1) mov byte ptr [bx],1
2) mov word ptr [bx],1
эти две команды похожи, но имеют разный код
это разные команды
первая строка - "записать байт со значением 1 по адресу, который содержится в регистре BX"
вторая строка - "записать слово со значением 1 по адресу, который содержится в регистре BX"
если в роли операнда мы указываем константу, то необходимо явно задавать размер данных
в случае mov [bx],ax неявно подразумевается mov word ptr [bx],ax
mov [bx],ax = mov word ptr [bx],ax
смотрим дальше
mov byte ptr [bx],120h
дело в том, что 120h = 288 = 100100000b
не влезает такое большое значение в 1 байт (8 бит), вот беда какая
максимальное значение байта равно FFh = 255 = 11111111b
а вот mov word ptr [bx],120h компилируется без ошибок, 255 в шестнадцати битах уместится без проблем