Если мы попытаемся использовать в инструкции два несовместимых по размеру операнда, то мы получим ошибку. Например:
.data num byte 17 .code main proc mov eax, num ret main endp end
В данном случае в 32-разрядный регистр EAX мы пытаемся поместить значение 8-разрядной переменной num. И в принципе то переменная num вполне может поместить в EAX, но ассемблер требует, чтобы оба операнда были одного размера. Соответственно программа не скомпилируется, и мы получим ошибку.
Чтобы решить данную проблему, мы можем применять преобразование типов. Преобзование имеет следующую форму:
тип ptr значение
Сначала указывается тип данных, в который мы преобразуем (byte, word, dword и т.д.). Далее идет оператор ptr, после которого указывается преобразуемое значение. Например, изменим предыдущую программу, применив преобразование:
.data num byte 17 .code main proc mov eax, dword ptr num ret main endp end
Выражение dword ptr num
означает, что значение num преобразуется к типу dword.
Подобным образом можно преобразовывать константы
num = 19 .code main proc mov eax, dword ptr num ret main endp end
Надо учитывать, что преобразования от типов с большим размеров в тип меньшего размера могут сопроваждаться потерей точности. Например:
.data num word 0FFFEh .code main proc mov al, byte ptr num ret main endp end
Здесь 16-разрядную переменную num (равная FFFEh или 65534 в десятичной системе) преобразуем в 8-разрядный тип byte для помещения в регистр AL. При преобразовании будет из 16 бит в 8 бит в num будет отброшен старший бит и останется число FEh или 254.
Если же значение преобразуемой переменной укладывается в диапазон значений требуемого типа, тогда проблем с преобразованием никаких нет.