Преобразование программы в машинные коды
В ЦП (центральном процессоре) находится набор регистров (специальных ячеек памяти), в которых выполняется вычисление, и указатель команды, который содержит номер следующей вызываемой ячейки памяти, где расположена очередная команда.
Во многих компьютерах, называемых Компьютерами с Сокращенной системой команд (RISC-Reduced Instruction Set Computers) для увеличения быстродействия используются только элементарные команды:
Доступ к памяти. Загрузить (load) содержимое слово памяти в регистр и сохранить (store) содержимое регистра в слове памяти.
Арифметические команды типа сложить (add) и вычесть (sub). Они выполняются над содержимым двух регистров или регистра и слова памяти. Результат остается в регистре. Например, команда
add R1, N
складывает содержимое слово памяти N с содержимым регистра R1 и оставляет результат в регистре.
Сравнить и перейти. ЦП может сравнить два значения, находящихся в регистрах и в зависимости от результата (равно, больше и т. д.) указатель команды изменяется. Например:
jump_ed R1, L1
…….
L1: …….
заставляет ЦП продолжать вычисление с команд с меткой L1, если R1=0 (ноль). В противном случае вычисление продолжается со следующей команды.
В компьютерах известных как CISC (Complex Instruction Set Computers) определен. Сложный набор команд, позволяющий упростить программирование на языке ассемблера и конструкцию компилятора.
Повторение. Память – это набор ячеек, в которых хранятся данные. Каждая ячейка памяти называется словом память и имеет адрес. Каждое слово память состоит из фиксированного числа битов: 16,32 или 64 битов. Современные ПК способны загружать и сохранять 8-битовые байты или двойные слова из 64 битов.
Примеры использования адресации в командах для С:
Пример 1. Способ непосредственной адресации, при которой операнд является частью команды. Значением операнда может быть адрес переменной (косвенная адресация):
load R2, #54 - загрузить значения 54 в регистр R2.
load R4, & N - загрузить адрес N в регистр R4.
Пример 2. Способ абсолютной адресации, в котором используется «символический» адрес переменной:
load R4, 43 -загрузить содержимое адреса 43 в R4.
load R3, I - загрузить содержимое переменной I в R3.
Пример 3. Использование индексных регистров. Индексные регистры не обязательно обособлены от регистров, используемых для вычислений.
load R2, 18 (R1) - загрузить в регистр R2 содержимое слова памяти, находящегося по адресу, равному сумме 18 и содержимому индексного регистра R1 (18+addr(R1), где addr(R1) - обозначение индексного регистра, скорее всего, даже суммы (add) индексного регистра (r))
add<-r=addr.
load R2, (R3) - загрузить содержимое addr(R3)+0 в R2 .Содержимое регистра R3 используется просто как адрес слова памяти, содержимое которого загружается в R2.
Пример 4. Использование команд при представлении выражения:
а*(b+с)
load R1, b
load R2, c
add R1, R2 – Сложить в ис. Результат занести в R1.
load R2, a
mult R1, R2 – Умножить а на b+c. Результат занести в R1.
Поскольку компьютеры – двоичные машины, распознающие только нули и единицы, то каждая команда, например, представленная в приведенных выше примерах, должна быть преобразована к двоичному цифровому виду. Одним из первых программных средств был символический ассемблер. Ассемблер берет программу, написанную на языке Ассемблера в символьном виде, и транслирует символы в двоичное представление, пригодное для выполнения на ПК.
