Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
C_01_01_Arhirecture_MMK_LEC_rus.doc
Скачиваний:
4
Добавлен:
12.11.2019
Размер:
223.23 Кб
Скачать

Ассемблер_2010

Введение

Исторический экскурс

  1. Машинно-ориентированное программирование появилось одновременно с создани­ем электронных вычислительных машин. Сначала это были программы в машинных ко­дах, затем появился язык программирования Assembler (Автокод). Этот стиль предполагает доскональное знание возможностей конкретной архитектуры ЭВМ и операци­онной системы и используется до сих пор тогда, когда другие стили бессильны, или нуж­но получить максимальное быстродействие в рамках той или иной операционной систе­мы с использованием архитектуры данной ЭВМ.

  2. Процедурное программирование. Основная идея этого стиля — алгоритмизация про­цесса решения задачи и выбор наилучшего алгоритма (по расходу памяти или по быстродей­ствию). Реализация этой идеи началась с 1957 года с появлением язы­ков Fortran и затем Algol-60.

Разработка программ стала более быстрой и надежной, а их машинная зависимость уменьшилась из-за абстрагирования от регистров и машинных команд. Знание тонкостей архитектуры ЭВМ не требовалось. Программа на алгоритмическом языке (при наличии соответствующих трансляторов) должна была в идеале работать на ЭВМ любой архитектуры. Но это были программы прикладные. Разработку же системных программ (самих трансляторов, сис­тем ввода-вывода) по-прежнему надо было делать на Ассемблере.

  1. Структурное программирование. Здесь основная идея прекрасно выражена Н. Виртом в его книге "Алгоритмы + структуры данных = программы". Это был ответ на кризис в области программирования, начавшийся в середине 60-х годов, когда объем исходного программного кода перешел рубеж в 1000 строк. В 1971 году появился к Pascal и в 1972 году, язык С. Алгоритмические языки стали более мощными, более "интеллектуальными", на них уже можно было пи­сать элементы трансляторов (компиляторов) и драйверов (подпрограмм обработки вво­да-вывода).

  2. Модульное программирование. Здесь основная идея заключалась в том, чтобы 'спрятать" данные и процедуры внутри независимых программных единиц модулей. Эту идею впервые реализовализованную в Modula "подхватили" и остальные, распространенные в то время языки программирования (Turbo Pascal и Turbo С).

В начале 1970-х Деннисом Ричи, сотрудником Bell Laboratories был разработан Язык С , как язык реализации операционной системы UNIX. Операционные системы традиционно писали на ассемблере, поскольку языки высокого уровня считались неэффективными. Язык С абстрагируется от деталей программирования, присущих ассемблерам, предлагая структурированные управляющие операторы и структуры данных (массивы и записи) и сохраняя при этом всю гибкость ассемблерного низкоуровневого программирования (указа- тели и операции на уровне битов).

  1. Объектно-ориентированное программирование. С середины 80-х годов объем исход­ного программного кода перешел рубеж в 100 000 строк. Нужно было сделать не случай­ное объединение данных и алгоритмов их обработки в единое целое, а — смысловое. То есть необходимо было создать модульное программирование нового уровня, когда основной акцент делается на смысловую связь структур данных и алгоритмов их обработки ( Object Pascal, C++, Java, Smalltalk).

  2. Обобщенные технологии разработки приложений. Идеология объектно-ориентиро­ванного программирования породила CASE-технологии разработки и сборки программ на основе уже известных программных моделей, содержащих интерфейсы и прототи­пы (шаблоны — template) данных: COM (Component Object Model), STL (Standard Template Library), ATL (Active Template Library). Все эти новшества поддерживают визу­альные среды разработки, например, такие известные, как Visual C++, Borland C++ Builder

Архитектура компьютера

Компьютер состоит из центрального процессора (ЦП) и памяти (рис. 1.1). Устройства ввода-вывода могут рассматриваться как частный случай памяти.

Все компоненты компьютера обычно подсоединяются к общей шине. Физически шина — это набор разъемов, соединенных параллельно; логически шина — это спецификация сигналов, которые дают возможность компонентам обмениваться данными. Компьютеры могут иметь дополнительные прямые соединения между компонентами для повышения производительности (путем специализации интерфейса и расширения узких мест). С точки зрения программного обеспечения единственное различие состоит в скорости, с которой данные могут передаваться между компонентами. В ЦП находится набор регистров (специальных ячеек памяти), в которых выполняется вычисление. ЦП может выполнить любую хранящуюся в памяти команду.

Элементарной единицей памяти всех современных компьютеров является байт, состоящий из восьми двоичных разрядов. Каждый байт имеет свой адрес. В наиболее распространенной 32-разрядной архитектуре адреса байтов изменяются от 0 до 232 - 1 с шагом 1. Память, с логической точки зрения, можно рассматривать как массив байтов: можно прочесть или записать байт с заданным адресом.

Однако физически при работе с памятью по шине передаются не отдельные байты, а машинные слова. В 32-разрядной архитектуре машинное слово — это четыре подряд идущих байта, при этом адрес младшего байта кратен четырем. (В 64-разрядной архитектуре машинное слово состоит из восьми байтов.)

Рассмотрим работу компьютера на простом примере.

Пусть оперативная память имеет размер 256 байт и делится на ячейки (машинные слова) размером 4 байта.

Адреса байтов лежат в интервале от 0 до 255. Но это десятичные адреса. В компьютере они двоичные. 25510 в двоичной системе: 255 = 111111112.

Диапазон адресов байтов от 0 до 111111112. В шестнадцатеричной системе - от 0 до FF (данная система счисления имеет следующий набор цифр: 0,1,2, …, 9, A, B, C, D, E, F).

Группы из 4 байтов образуют ячейки. Адрес ячейки равен адресу младшего байта, входящего в нее (байта с меньшим номером).

Схематически структуру памяти учебного компьютера можно представить так:

Адреса ячеек

Байты

00

00

01

02

03

04

04

05

06

07

08

08

09

0A

0B

0C

0C

0D

0E

0F

10

10

11

12

13

14

14

15

16

17

..

F8

F8

F9

FA

FB

FC

FC

FD

FE

FF

Рис.1

Адреса ячеек меняются с шагом 4. Первая ячейка имеет адрес 00, последняя - FC. Адреса представляются двузначными шестнадцатеричными числами, что соответствует восьмизначным двоичным числам. Следовательно, при хранении адреса в памяти он занимает 1 байт (8 бит).

Всего в памяти 64 ячейки (256/4). В ячейке может храниться либо число, либо команда программы.

Разрядность адреса (длина адресного кода) равна 8 бит, поэтому размер адресного пространства равен 28=256 байт.

Учебный компьютер (УК) работает только с целыми числами.

Согласно принципу Неймана - принципу хранимой в памяти программы, наряду с данными в оперативную память компьютера помещается программа управления его работой ( у процессоров гарвардской архитектуры память для хранения команд и данных разделена). Способ представления программы "понятный" процессору ЭВМ называется языком машинных команд – ЯМК. Программа на ЯМК реализует алгоритм решения вычислительной задачи на компьютере-исполнителе.

Машинная команда должна содержать в себе ответы на следующие вопросы:

  • какую операцию выполнить?

  • где находятся операнды?

  • куда поместить результат операции?

  • какую команду выполнять следующей?

Пусть машинные команды имеют трехадресную структуру (формат). Это значит, что ячейка, в которой храниться команда, делится на 4 части (по одному байту на каждую часть). Будем их обозначать следующим образом: КОП - код операции, А1 - адрес первого операнда, А2 - адрес второго операнда, А3 - адрес результата.

КОП

А1

А2

А3

Операндами называют данные, с которыми производится операция. В арифметических операциях это слагаемые, сомножители, уменьшаемое и вычитаемое, делимое и делитель.

Вот пример команды сложения двух чисел:

КОП

А1

А2

А3

01

44

48

где

01 - это код операции сложения;

44 – адрес ячейки, в которой хранится первое слагаемое;

48 - адрес ячейки, в которой хранится второе слагаемое;

4С - адрес ячейки, в которую помещается результат (сумма).

Для всех арифметических операций ответ на вопрос: "Какую команду выполнять следующей?" всегда одинаковый - следующей выполняется команда, находящаяся в следующей ячейке.

Записывать команды будем в шестнадцатеричной форме. В памяти ЭВМ команда имеет двоичный вид. Используя связь между двоичной и шестнадцатеричной системами, легко получить внутреннее представление приведенной команды.

КОП

А1

А2

А3

0000 0001

0100 0100

0100 1000

0100 1100

В табл.1 содержится система команд нашего УК .

Запись (A1) + (A2) ==> A3 надо понимать так: содержимое ячейки с адресом A1 сложить с содержимым ячейки с адресом A2 и результат записать в ячейку A3; (A1) ==> A3 - содержимое ячейки A1 занести (скопировать) в ячейку A3.

Таблица 1.

КОП

Операция

Пояснение

00

Пересылка

(A1) ==> A3

01

Сложение

(A1) + (A2) ==> A3

02

Вычитание

(A1) - (A2) ==> A3

03

Умножение

(A1) x (A2) ==> A3

04

Деление нацело

(A1) div (A2) ==> A3 целая часть от деления

05

Получение остатка от деления нацело

(A1)mod(A2)==>A3 остаток от деления нацело

77

Останов

Прекращение выполнения программы

FF

Пустая команда

При выполнении пропускается

Каждое число, участвующее в расчетах, занимает ячейку памяти. Программист должен сам распределять память под данные. Команды программы тоже занимают память.

Пусть, например, требуется вычислить выражение ( А + B ) x C.

Под величины А, В, С выделим ячейки памяти с адресами:

А

В

С

20

24

28

Результат вычисления выражения поместим в ячейку 2С.

Адрес

КОП

А1

А2

А3

Пояснение

0C

01

20

24

2C

(20) + (24) ==> 2C

A+B

10

03

2C

28

2C

(2C) x (28) => 2C

(A+B) x C

В графе "Адрес" указываются номера ячеек, в которых располагаются команды. Команды этой программы выполняются в "естественном порядке" возрастания адресов: сначала , затем 10.

Ячейке значение присваивается дважды: сначала результат суммирования, затем - умножения. Первый результат - промежуточный, второй - окончательный.

Эта программа не может быть исполнена. Во-первых, не определены значения исходных данных А, В, С. Во-вторых, пользователь не сможет узнать результаты вычислений, поскольку они останутся внутри памяти, в ячейке , а в нее не заглянешь.

Исходные данные задаются вводом.

Ввод - это занесение данных в оперативную память через устройства ввода.Пусть устройством ввода является клавиатура.

Результаты вычислений должны быть выведены - это отражение информации из оперативной памяти на устройствах вывода. (дисплей).

Договоримся о следующем способе организации ввода-вывода. С клавиатурой и дисплеем связана последняя ячейка памяти - ячейка FC. Будем называть ее буферной ячейкой ввода-вывода.

При вводе набираемое на клавиатуре значение попадает в ячейку FC. На дисплее постоянно отражается содержимое ячейки FC в шестнадцатеричном виде. Поэтому для вывода значения из любой ячейки памяти его надо переслать в буферную ячейку FC.

Ячейка FC выполняет роль своеобразной видеопамяти. На индикаторе пользователь всегда видит содержимое ячейки FC.

Структура команды пересылки следующая:

00

А1

- -

А3

Эта команда, фактически, двухадресная. Содержимое второго адреса (А2) не влияет на ее исполнение (в дальнейшем на месте второго адреса будем писать нули). В результате выполнения команды пересылки значение в ячейке А3 становится равным (А1). При этом значение в ячейке А1 не меняется. Иначе это называется так: ячейке А3 присваивается значение ячейки А1.

Поясним на примере. Пусть в 10-й ячейке находится число 5, а в 20-й ячейке число 7:

A1A3

адрес10

20

содержимое5

7

После выполнения команды 00 10 00 20 их значения станут одинаковыми

A1A3

адрес10

20

содержимое5

5

Вернемся к нашей программе. На дисплей нужно вывести результат вычислений, полученный в ячейке . Для этого его следует присвоить ячейке FC. Значит, команда вывода будет такой:

00 2С 00 FC.

Ввод значения А в ячейку 20:

00 FC 00 20.

Процессор, обнаружив команду, у которой код операции равен 00 и А1=FC, прерывает работу и ждет действий пользователя. Пользователь набирает на клавиатуре вводимое число. Это число заносится в ячейку FC и, одновременно, высвечивается на дисплее. Затем пользователь нажимает клавишу <ВВОД>. Процессор выполняет команду пересылки из ячейки FC в ячейку 20. Ввод завершился, процессор переходит к выполнению следующей команды.

Запишем команды ввода и вывода в общем виде:

00 FC - A3

- ввод числа в ячейку А3

00 А1 - FC

- вывод числа из ячейки А1

А теперь запишем программу вычисления выражения (А+В)С в окончательном виде. Договоримся, что любая программа будет занимать ячейки в начале памяти. Первая команда всегда находится в ячейке 00.

Таблица 2

Адрес

КОП

А1

А2

A3

Пояснения

00

00

FC

00

20

ввод А

04

00

FC

00

24

ввод В

08

00

FC

00

28

ввод С

0C

01

20

24

2C

A+B

10

03

2C

28

2C

(A+B)C

14

00

2C

00

FC

вывод результата

18

77

00

00

00

Стоп

В ячейке 18 находится команда останова с кодом операции 77 - остановка работы машины. Содержимое адресной части в этой команде не имеет значения.

Предположим, что по этой программе мы хотим вычислить выражение при А=26, В=74, С=3.

Процессор начинает исполнять программу с команды, находящейся в ячейке 00. В нашей программе это команда ввода числа А. ЭВМ останавливается и ждет действий пользователя. Пользователь набирает на клавиатуре шестнадцатеричный код числа 26:

00 00 00 1А <ВВОД>.

После нажатия клавиши <ВВОД> число 26 введено в ячейку 20. Следующая команда требует ввода значения В. Пользователь вводит:

00 00 00 4А <ВВОД>.

Последним вводится значение С:

00 00 00 03 <ВВОД>.

Следующие команды программы выполняются автоматически. После выполнения команды вывода (ячейка 14) происходит остановка. Она нужна для того, чтобы пользователь успел разглядеть результат на дисплее, если в программе несколько команд вывода. Для введенных значений исходных данных результат на дисплее будет таким:

00 00 01 2С.

Программа продолжит исполнение после нажатия клавиши <ВВОД>. Работа программы завершится по команде останова.

Полученный результат - это шестнадцатеричная форма внутреннего представления. 12С16 = 30010

Мы видим, что числа вводятся и выводятся в шестнадцатеричном виде. Родной язык компьютера - это язык машинных команд и двоичных чисел. Автоматический перевод чисел из двоичной в десятичную систему и обратно производится с помощью специальных программ перевода, а это уже программный сервис.

А теперь рассмотрим, как процессор выполняет машинные команды.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]