Оператор указания типа

Как было сказано, операнды команды MOV должны иметь одинаковый размер. В некоторых случаях компилятор может определить размер операнда. Например, регистр EAX имеет размер 32 бита, а регистр DX – 16 бит. Размер переменной определяется по директиве, указанной в её объявлении. Если можно определить размер только одного операнда, то размер второго операнда подгоняется под размер первого, если это возможно. Если же можно определить размеры обоих операндов, то они должны совпадать.

x db?

mov x, 0; 0 может иметь любой размер, в данном случае берётся 1 байт

mov eax, 0; 0 может иметь любой размер, в данном случае берётся 4 байта

mov al, 1000h; Ошибка – попытка записать 2-байтное число в 1-байтный регистр

mov eax, cx; Ошибка – размеры операндов не совпадают

Однако не всегда бывает возможно определить размер пересылаемой величины по операндам команды MOV. Например, если один из операндов является ячейкой памяти, адрес которой записан в регистре, то по этому адресу можно записать и 1 байт, и 2 байта, и 4 байта. Если второй операнд является регистром, то размер пересылаемых данных определяется по размеру регистра. Если же второй операнд является константой, то размер пересылаемых данных определить нельзя, и компилятор фиксирует ошибку. Для того чтобы избежать этой ошибки, надо явно указать размер пересылаемых данных. Для этого используется оператор PTR:

<тип> PTR <выражение>

В качестве типа используется BYTE, WORD или DWORD.

mov [ebx], 0; Ошибка, т.к. 0 может иметь любой размер

mov byte ptr [ebx], 0; Пересылаем 1 байт

mov dword ptr [ebx], 0; Пересылаем 4 байта


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: