Программирование на Ассемблере
Тогда доступ к
последнему элементу может осуществляться одной командой, как показано в
следующем примере: ... CLR.L D0 ;очистка D0
MOVE.L #RECORD,A0 ;адрес массива - в A0
MOVE.B (A0),D0 ;число элементов-1 - в D0
MOVE.B 1(A0,D0),D1 ;последний элемент - в D1 ... Здесь последняя команда извлекает элемент, расположенный по адресу 1+A0+D0,
или, другими словами, по адресу начала структуры плюс один (здесь начинается
массив) и плюс смещение, заданное в D0 (в нашем случае 2).
Этот метод доступа к данным используется очень часто, он прекрасно подходит
для работы с таблицами и списками. Если смещение не требуется, можно
написать так: MOVE 0(A0,D0),D1 (а некоторые ассемблеры подставляют нулевое
смещение по умолчанию, так что его можно явно не указывать).
Последние два метода имеют еще одну разновидность, в которой используется
смещение относительно содержимого программного счетчика (PC). Используя
косвенный регистровый метод со смещением относительно PC можно писать
перемещаемые программы. Следующие две команды эквивалентны (при условии,
что смещение от адреса второй команды до адреса MARKER может быть
закодировано 16-ю битами): MOVE MARKER,D1
и
MOVE MARKER(PC),D1 Если в первой команде задается абсолютный адрес переменной MARKER, то во
второй - смещение от самой команды до метки MARKER (это смещение
вычисляется ассемблером и автоматически подставляется в код). Рассмотрим подробнее разницу между этими двумя командами. Несмотря на то,
что действия их эквивалентны, машинное представление у них разное.
Пусть команда MOVE расположена с адреса $1000, а переменная MARKER - с
адреса $1100. Тогда машинный код, сгенерированный ассемблером, будет
выглядеть примерно так: $001000 30 39 00 00 11 00 MOVE MARKER,D1 и второй вариант: $001000 30 3A 00 FE MOVE MARKER(PC),D1 Отсюда видно, что второй вариант кода на два байта короче первого.
|