Программирование на Ассемблере

       

Использование данных разной длины


Пусть необходимо оттранслировать операторы присваивания:

с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



Содержание раздела