- •Лабораторная работа №1 Компилятор fasm Арифметические операции.
- •Теоретическая часть
- •1. Представление данных в компьютерах
- •1.1. Двоичная система счисления
- •1.2. Биты, байты и слова
- •1.3. Шестнадцатеричная система счисления
- •1.4. Числа со знаком
- •1.5. Логические операции
- •1.6. Коды символов
- •1.7. Организация памяти
- •2. Процессоры Intel в реальном режиме
- •2.1. Регистры процессора
- •2.1.1. Регистры общего назначения
- •2.1.2. Сегментные регистры
- •2.1.3. Стек
- •2.1.4. Регистр флагов
- •2.2.4. Косвенная адресация
- •2.2.5. Адресация по базе со сдвигом
- •2.2.6. Косвенная адресация с масштабированием
- •2.2.7. Адресация по базе с индексированием
- •2.2.8. Адресация по базе с индексированием и масштабированием
- •2.3. Основные непривилегированные команды
- •2.3.2. Двоичная арифметика
- •3. Компилятор fasm
- •Практическая часть
- •Задания для самостоятельной работы
- •Индивидуальные варианты
2.2.4. Косвенная адресация
По аналогии с регистровыми и непосредственными операндами адрес операнда в памяти также можно не указывать, а хранить в любом регистре. До процессора 80386 для этого можно было использовать только ВХ, SI, DI и ВР, но потом ограничения были сняты и адрес операнда разрешили считывать также из ЕАХ, ЕВХ, ЕСХ, EDX, ESI, EDI, ЕВР и ESP (но не из АХ, СХ, DX или SP напрямую - надо использовать ЕАХ, ЕСХ, EDX, ESP соответственно или предварительно скопировать смещение в ВХ, SI, DI или ВР). Например, следующая команда помещает в регистр АХ слово из ячейки памяти, селектор сегмента которой находится в DS, а смещение - в ВХ:
Как и в случае с прямой адресацией, DS используется по умолчанию, но не всегда: если смещение берут из регистров ESP, EBP или ВР, то в качестве сегментного регистра применяется SS. В реальном режиме можно свободно работать со всеми 32-битными регистрами, надо только следить, чтобы их содержимое не превышало границ 16-битного слова.
2.2.5. Адресация по базе со сдвигом
Теперь скомбинируем два предыдущих метода адресации. Следующая команда
помещает в регистр АХ слово, которое есть в сегменте, указанном в DS, со смещением на два больше, чем число из ВХ. Так как слово занимает ровно 2 байта, эта команда поместила в АХ слово, непосредственно следующее за тем, которое было в предыдущем примере. Такая форма адресации используется в тех случаях, когда в регистре находится адрес начала структуры данных, а доступ надо осуществить к какому-нибудь ее элементу. Еще один вариант применения адресации по базе со сдвигом — доступ из подпрограммы к параметрам, переданным в стеке, используя регистр ВР (ЕВР) в качестве базы и номер параметра в качестве смещения. Другие допустимые формы записи этого способа адресации:
До процессора 80386 в качестве базового регистра разрешалось использовать только ВХ, ВР, SI или DI и сдвиг мог быть только байтом или словом (со знаком).
Начиная с 80386 и старше, процессоры Intel позволяют дополнительно использовать ЕАХ, ЕВХ, ЕСХ, EDX, EBP, ESP, ESI и EDI, так же как и для обычной косвенной адресации. С помощью этого метода разрешается организовывать доступ к одномерным массивам байтов: смещение соответствует адресу начала массива, а число в регистре - индексу элемента массива, который надо считать. Очевидно, что, если массив состоит не из байтов, а из слов, придется умножать базовый регистр на два, а если из двойных слов - на четыре. Для этого предусмотрен специальный метод - косвенная адресация.
2.2.6. Косвенная адресация с масштабированием
Этот метод адресации полностью идентичен предыдущему, однако с его помощью можно прочитать элемент массива слов, двойных слов или учетверенных слов, просто поместив номер элемента в регистр:
Множитель, который равен 1, 2, 4 или 8, соответствует размеру элемента массива — байту, слову, двойному или учетверенному слову. Из регистров в этом варианте адресации можно использовать только ЕАХ, ЕВХ, ЕСХ, EDX, ESI, EDI, EBP, ESP, но не SI, DI, ВР или SP.
2.2.7. Адресация по базе с индексированием
В этом методе адресации смещение операнда в памяти вычисляется как сумма чисел, содержащихся в двух регистрах, и смещения, если оно указано. Все перечисленные ниже команды представляют собой разные формы записи одного и того же действия:
В регистр АХ помещается слово из ячейки памяти со смещением, равным сумме чисел, содержащихся в ВХ, SI, и числа 2. Из 16-битных регистров так можно складывать только ВХ + SI, ВХ + DI, ВР + SI и ВР + DI, а из 32-битных — все восемь регистров общего назначения. Как и для прямой адресации, вместо непосредственного указания числа разрешено использовать имя переменной, заданной одной из директив определения данных. Таким образом, можно считать, например, число из двумерного массива: если задана таблица 10x10 байт, 2 – смещение ее начала от начала сегмента данных, ВХ = 20, a SI = 7, приведенные команды прочитают слово, состоящее из седьмого и восьмого байтов третьей строки. Если таблица состоит не из одиночных байтов, а из слов или двойных слов, удобнее использовать наиболее полную форму - адресацию по базе с индексированием и масштабированием.