Работа с данными и памятью

Преобразование данных

Последнее обновление: 02.07.2023

Если мы попытаемся использовать в инструкции два несовместимых по размеру операнда, то мы получим ошибку. Например:

.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.

Если же значение преобразуемой переменной укладывается в диапазон значений требуемого типа, тогда проблем с преобразованием никаких нет.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850