Использование данных разной длины
Пусть необходимо оттранслировать операторы присваивания:
с2 = s3;
i1[0] = c2;
Для обращения к данным разной длины необходимо преобразование их типов. Для преобразования типов используется преобразователь вида:
<Тип> PTR, где тип : BYTE PTR, WORD PTR, DWORD PTR, PWORD PTR, FWORD PTR, QWORD PTR, TBYTE PTR. Для режима IDEAL вместо записи вида <Тип> PTR можно использовать только тип, например BYTE. Преобразование типа можно использовать только для уменьшения длины. Использование преобразователя типа для увеличения длины приведет к неправильному обращению к данному, т.к. фактически используются последовательные области памяти.
Пример использования преобразования типа в командах пересылки:
; с2 = s3;
mov AL, [BYTE PTR s3]
mov [c2], AL
; i1[0] = c2;
mov eax, 0
mov al, [c2]
mov [i1], eax
Реализация последнего оператора корректна только в том случае, если правая часть - число положительное. Для отрицательного числа необходимо другое начальное значение eax.
Для расширения знаковых и беззнаковых чисел используются команды:
MOVZX – расширение беззнакового числа;
MOVSX – расширение знакового числа.
В этих командах первый операнд - регистр R16 или R32. Второй операнд регистр или память длиной 8, 16 байтов. Дополнение выполняется нулями (MOVZX), или знаковым разрядом (MOVSX).
С помощью этих команд
; i1[0] = c2;
movzx eax, [c2]
mov [i1], eax