Фортран
или Си. Несколько слов по поводу языка машинных кодов и языка ассемблера. Как уже упоминалось выше, ЦП компьютера предназначен для интерпретации определенных машинных слов в качестве команд и выполнения соответствующих программных процедур. Такой машинный язык состоит из набора двоичных команд, каждая из которых занимает один или несколько байт. Например, команда инкрементирования (увеличения на единицу) содержимого регистра ЦП будет однобайтовой, в то время как загрузка в регистр содержимого памяти обычно требует как минимум двух байт, причем это число может быть увеличено до пяти (при этом первый будет определять собственно команду и регистр, а четыре будут необходимы для указания произвольной ячейки памяти для большой машины). Печальной реальностью нашей действительности является то, что разные компьютеры имеют отличающиеся машинные языки и здесь нет совершенно никакой стандартизации.Программирование непосредственно в машинных кодах является исключительно тоскливым занятием, так как приходится иметь дело с колонками двоичных чисел, каждый бит которых существенен. Поэтому вы неизбежно должны использовать программу, называемую ассемблером
; она позволяет писать программы, используя легко запоминаемые мнемонические обозначения команд и символьные имена, которые вы можете придумывать сами для ячеек ОЗУ и переменных. Программа на языке ассемблера на самом деле не более, чем набор похожих на шифр строк, содержащих буквы и числа; ее следует передать «в руки» программы, называемой ассемблер, для того чтобы получить в результате законченную программу в машинном объектном коде, которую компьютер может выполнить[3]. Каждая строка ассемблерного кода превращается в несколько байт машинного кода (1–6 байт для МП Intel 8086). Непосредственно выполнять команды на языке ассемблера компьютер не в состоянии.Для того чтобы конкретизировать высказанные соображения, рассмотрим наше подмножество команд языка ассемблера МП Intel 8086/8 и выполним несколько примеров.
10.03. Упрощенный набор команд процессора Intel 8086/8
Intel 8086 — это 16-разрядный процессор с богатым и несколько своеобразным набором команд, сложность которого отчасти обусловлена стремлением разработчиков сохранить совместимость с 8-разрядным МП Intel 8080 ранней модели. Более поздние разработки, такие как МП Intel 80286 и 80386, все еще поддерживают полный набор команд МП Intel 8086. Вооружившись подходящим мачете, выберемся из джунглей полного набора команд, сохранив лишь нужные нам сейчас 10 арифметических команд и 11 прочих. Вот они:
Краткий обзор.
Некоторые пояснения: первые шесть арифметических команд работают с парами чисел (2-х операндные команды), которые мы обозначим как Ь, а и которые могут представлять собой любую из пяти пар, указанных в примечании; при этом m означает содержимое ячейки памяти, r означает содержимое регистра ЦП (их 8), a imm — непосредственный аргумент, который представляет собой число, располагаемое в следующих за командой от 1 до 4 байт памяти. Таким образом, например, команды:MOV
count,CXADD
small,02HAND
AX,007FHимеют аргументы типов m, r, m, imm, r, imm
соответственно. Первая копирует содержимое регистра СХ в ячейку памяти, именуемую count; вторая прибавляет 2 к содержимому другой ячейки памяти, именуемой small; третья обнуляет 9 старших разрядов 16-разрядного регистра АХ, сохраняя при этом 7 младших разрядов неизменными (так называемая операция маскирования). Отметим принятое фирмой Intel соглашение о порядке аргументов: первый аргумент замещается вторым или модифицируется на основе значения второго аргумента. (В следующей главе мы увидим, что Motorola предписывает другой порядок действий).Последние четыре арифметические операции имеют только один операнд, который может быть содержимым либо регистра, либо ячейки памяти. Вот два примера:
INC
countNEG
ALПервая команда прибавляет 1 к ячейке памяти, именуемой count, а вторая изменяет знак содержимого регистра AL.
Лирическое отступление: адресация.
Прежде, чем продолжить, несколько слов по поводу адресации регистров и памяти. Процессор Intel 8086 предлагает использовать 8 его регистров общего назначения, однако после изучения рис. 10.2 вы придете к заключению о том, что большинство этих регистров используются специфически.
Рис. 10.2.
Регистры общего назначения МП 8086.