Главная страница
Навигация по странице:

  • PROGRAM

  • Адрес Команда Расшифровка Комментарий

  • Практическая работа №3. Изучение принципов работы ПК. Цель работы

  • Функции памяти

  • 1. Принцип программного управления.

  • Методические указания для практических занятий по дисциплине мдк. 02. 01


    Скачать 7.37 Mb.
    НазваниеМетодические указания для практических занятий по дисциплине мдк. 02. 01
    Дата09.09.2022
    Размер7.37 Mb.
    Формат файлаpdf
    Имя файлаMetod_Mikroprocessornye-sistemy_PZ_09.02.01_2020.pdf
    ТипМетодические указания
    #669073
    страница3 из 43
    1   2   3   4   5   6   7   8   9   ...   43
    Операция
    Код
    Мнемоника Комментарии
    2 с/с 8 с/с
    перепись
    000 0
    MOV
    A3 = A1 сложение
    001 1
    ADD
    A3 = A1 + A2 деление нацело 010 2
    DIV
    A3 = A1 div A2 модуль разности 011 3
    SUB
    A3 = |A1 - A2| переход по =
    100 4
    JE при A1 = A2 – перейти к A3 умножение
    101 5
    MUL
    A3 = A1 * A2 переход по >
    110 6
    JG при A1 > A2 – перейти к A3 стоп и вывод
    111 7
    HLT
    A1, A2, A3 на дисплей; стоп
    Для уменьшения технической работы используем некоторые упрощения; они не повлияют на понимание принципов ассемблера, зато существенно ускорят программирование.

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

    Все метки (идентификаторы) условимся обозначать одной латинской буквой, после которой ставится двоеточие. Хотя это и несложно, проверять каждую новую метку на совпадение со старыми не будем; факт того, что это именно латинская буква, для простоты также не проверяется.

    Части команды (метка, операция и 3 адреса) разделены между собой произвольным

    17
    количеством пробелов (M: ADD X Y R).

    Константы (десятичные числа), заносимые ассемблером в ячейки, будем записывать после обозначения DN, например, DN 19. Правильность значения константы (для «Крохи» она должна быть целой и неотрицательной, не превышающей 4095) контролировать не будем.

    Так как практическая эксплуатация нашего программного продукта не предполагается, диагностику ошибок в нем предусматривать не будем (известно, что это часто наиболее трудоемкая часть программы!)

    Вместо длинных 12-разрядных двоичных кодов, которые вполне оправданы в учебнике для демонстрации принципов Неймана, везде будем пользоваться более короткими восьмеричными кодами; подчеркнем, что данная система прекрасно гармонирует с командами «Крохи», у которых и код операции, и адреса состоят именно из трех двоичных разрядов.
    Благодаря принятым упрощениям ассемблирующая программа на Паскале получается совсем небольшой (ниже приводится ее листинг).
    PROGRAM kroha_asm(INPUT,OUTPUT); {Демо-ассемблер для учебной ЭВМ «Кроха»}
    CONST kop:ARRAY [0..7] OF STRING[3]= {мнемоники команд}
    ('MOV','ADD','DIV','SUB','JE','MUL','JG','HLT') prg:ARRAY [0..7] OF STRING= {ассемблируемая программа!!!}
    ('B: MUL F K F',
    ' ADD K E K',
    ' JG N K B',
    ' HLT F F F',
    'K: DN 1',
    'F: DN 1',
    'N: DN 3',
    'E: DN 1');
    VAR tab: ARRAY [0..15] OF RECORD sym:STRING[3]; num:BYTE END;
    {tab – это таблица всех идентификаторов (их имя и код), включая операции и метки} i,Nid,k,e,c:INTEGER; {рабочие переменные}
    FUNCTION get_code(i:INTEGER; VAR k:INTEGER):BYTE;
    {выделяет из строки с номером i начиная с позиции k очередной идентификатор и находит в tab его код}
    VAR p,id:STRING; j,m,q:INTEGER; {рабочие переменные}
    BEGIN p:=prg[i]+' '; {добавим пробел для удобства выделения последней метки}
    WHILE (k<LENGTH(p))AND(p[k]=' ') DO k:=k+1; {пропустим пробелы}
    {а теперь выберем все до следующего пробела, т.е. получим имя идентификатора} id:=''; WHILE p[k]<>' ' DO BEGIN id:=id+p[k]; k:=k+1 END; q:=255; {найдем, если идентификатор есть, в таблице и поместим его код в q}
    FOR j:=0 TO Nid DO IF id=tab[j].sym THEN q:=tab[j].num; get_code:=q {результатом функции является код, заносимый в программу}
    END
    BEGIN FOR i:=0 TO 7 DO {занесем в tab коды операций}
    BEGIN tab[i].sym:=kop[i];tab[i].num:=i
    END; tab[8].sym:='DN';tab[8].num:=8; Nid:=8; {добавим условный код DN}
    FOR i:=0 TO 7 DO {проход I – занесение в таблицу меток программиста}
    IF prg[i][2]=':' THEN {после метки двоеточие}
    BEGIN inc(Nid); {добавляем метку в таблицу; ее адрес=номеру строки!} tab[Nid].sym:=prg[i][1];tab[Nid].num:=i; prg[i][1]:=' '; prg[i][2]:=' '; {удалим метку из текста}

    18
    END;
    FOR i:=0 TO Nid DO {для контроля выведем tab}
    WRITELN(tab[i].sym:4, tab[i].num:4);
    FOR i:=0 TO 7 DO {проход II – «генерация» кода на экран}
    BEGIN k:=1; c:=get_code(i,k); {код операции}
    CASE c OF {выделяем команды или DN}
    0..7: BEGIN WRITE(c); {<код операции}
    WHILE k<=LENGTH(prg[i]) DO {3 адреса}
    WRITE(' ',get_code(i,k))
    END;
    8:{DN}BEGIN {выделить 10-число и перевесит в 8 с/с}
    VAL(COPY(prg[i],k,255),k,e);
    WRITE(' '); e:=512;
    REPEAT WRITE(k DIV e); k:=k MOD e; e:=e DIV 8;
    UNTIL e=0
    END
    END;
    WRITELN {конец вывода команды}
    END;
    END
    Программа работает следующим образом. Ядром ее данных служит таблица идентификаторов, которая содержит их имена в поле sym и коды, которые вместо этих имен надо подставлять в программу (поле num). Например, операция ADD имеет код 1 (см. табл. 4), поэтому tab[1].sym=’ADD’ и tab[1].num=1. Становится очевидным, что центральная идея ассемблера состоит в замене, пользуясь таблицей, каждого символьного имени соответствующим ему числовым кодом.
    После занесения в строки таблицы с номерами от 0 до 7 мнемоник команд «Крохи», добавим далее оператор определения константы DN и все найденные в программе метки, которые поставил пользователь в тексте. Метки пользователя распознаются по наличию после них двоеточия; чтобы обработанные метки не мешали ассемблеру в дальнейшем, программа их просто стирает. Обработка меток в литературе носит название первого прохода, поскольку сначала надо «пройти» всю программу и подготовить полную таблицу идентификаторов, и только потом повторно просмотреть текст (второй проход), заменяя с помощью таблицы все идентификаторы их кодами.
    При выполнении второго прохода наш ассемблер опирается на «мощную» функцию get_code, которая выделяет из текста программы очередной идентификатор. Несмотря на сложный вид, идея функции достаточно проста: в заданной строке, начиная с заданной позиции, она пропускает пробелы, а затем, наоборот, «собирает» все отличающиеся от пробела символы, формируя тем самым имя очередного идентификатора. Когда имя выделено, оно ищется в таблице и в качестве результата выдается его код (или 255, если имя в таблице отсутствует).
    Примечание. Особо отметим, что алгоритм функции построен так, чтобы автоматически подготовить значение переменной k для нового вызова с целью выделения следующего в этой строке идентификатора.
    Пользуясь описанной функцией, ассемблер выделяет первый идентификатор текущей строки программы и определяет его код. Если он попадает в диапазон от 0 до 7, то это машинная команда и в ней с помощью таблицы кодируются идущие следом 3 метки переменных (3 адреса).
    Если же обнаруживается, что код равен 8, то это определение числа. Последнее извлекается из строки и переводится в восьмеричную систему счисления. Все остальные случаи являются ошибкой и нашим ассемблером просто игнорируются.
    Заметим, что итоговый восьмеричный код программы просто выводится на экран дисплея и нигде не сохраняется.
    Для тестирования демо-ассемблера реализована традиционная задача – вычисление

    19
    факториала числа n. Обозначим k рабочую переменную, которая является текущим множителем для факториала и меняется от 1 до n. Тогда итоговая программа приобретает вид, приведенный в табл. 5.
    Таблица 5
    Адрес Команда
    Расшифровка
    Комментарий
    0 5545
    (5) * (4) ==> (5) n! * k ==> n!
    1 1474
    (4) + (7) ==> (4) k + 1 ==> k
    2 6640 если (6)>(4), перейти к 0 переход при k < n+1 3
    7555 стоп; вывод (5), (5), (5) вывод n!
    4 k [задать 1] рабочая ячейка
    5 n! [задать 1] результат
    6 n + 1 [задать] константа
    7 0001 1 константа 1
    Второй столбец данной таблицы может быть использован для проверки результатов ассемблирования, которые наша программа выводит на экран.
    В качестве продолжения нашего эксперимента предлагаем читателям самостоятельно написать обратную программу – дизассемблер, которая по восьмеричному 4-разрядному коду восстанавливает ассемблерную мнемонику команд. Для решения задачи советуем воспользоваться таблицей, аналогичной tab, если потребуется, разделив ее на части. Разумеется, первоначальные имена меток по коду не восстановить, поэтому можно присваивать им по мере появления последовательные значения букв латинского алфавита.
    А теперь подведем итоги того, что мы узнали.
    В основе ассемблирования программы лежит относительно простая идея табличной замены имен идентификаторов соответствующими им кодами. В то же время реализация этой идеи ведет к замечательным последствиям: в программе исчезают все адреса и ее исправление становится не сложнее, чем исправление текста в текстовом редакторе: поскольку адреса переменных и команд распределяются теперь автоматически, следить за их изменением вовсе не нужно. Еще раз подчеркнем, что именно в этом, а не в замене кодов операций и регистров буквенными мнемониками, заключается истинная мощь ассемблера. В отладчике Debug, предназначенном в основном для отладки уже готовой программы, поддержка механизма меток не предусмотрена.
    Подчеркнем, что ассемблер – это язык программирования, хотя и весьма низкого уровня, жестко ориентированный на систему команд того процессора, для которого он предназначается.
    Очень важно отметить, что каждая исполняемая строка ассемблерного текста в точности соответствует одной машинной команде, что является характерной особенностью ассемблера.
    Отказ от данного ограничения и разрешение автоматической замены строки программы серией
    команд открывает дорогу (через так называемый макроассемблер) к простейшим языкам высокого уровня. В последних текст программы уже больше не содержит прямых ссылок на инструкции процессора, следовательно, сам язык становится машинно-независимым. Генерацию конкретных машинных инструкций полностью принимает на себя программное обеспечение – транслятор языка, который в традиционных реализациях является машинно-зависимым
    Контрольные вопросы.
    1. Как хранится и обрабатывается информация в компьютере?
    2. Что такое мнемоника?
    3. Что такое директива?
    4. Что лежит в основе ассемблирования программы?
    Практическая работа №3. Изучение принципов работы ПК.
    Цель работы: изучение общих принципов организации и работы компьютеров.

    20
    Теоретическая часть
    Компьютер (англ. computer — вычислитель) представляет собой программируемое электронное устройство, способное обрабатывать данные и производить вычисления, а также выполнять другие задачи манипулирования символами [51] .
    Существует два основных класса компьютеров:
    цифровые компьютеры, обрабатывающие данные в виде двоичных кодов;
    аналоговые компьютеры, обрабатывающие непрерывно меняющиеся физические величины (электрическое напряжение, время и т.д.), которые являются аналогами вычисляемых величин.
    Поскольку в настоящее время подавляющее большинство компьютеров являются цифровыми, далее будем рассматривать только этот класс компьютеров и слово "компьютер" употреблять в значении "цифровой компьютер".
    Основу компьютеров образует аппаратура (HardWare), построенная, в основном, с использованием электронных и электромеханических элементов и устройств. Принцип действия компьютеров состоит в выполнении программ (SoftWare) — заранее заданных, четко определённых последовательностей арифметических, логических и других операций.
    Любая компьютерная программа представляет собой последовательность отдельных команд.
    Команда — это описание операции, которую должен выполнить компьютер. Как правило, у команды есть свой код (условное обозначение), исходные данные (операнды) и результат.
    Например, у команды "сложить два числа" операндами являются слагаемые, а результатом — их сумма. А у команды "стоп" операндов нет, а результатом является прекращение работы программы.
    Результат команды вырабатывается по точно определенным для данной команды правилам, заложенным в конструкцию компьютера.
    Совокупность команд, выполняемых данным компьютером, называется системой команд этого компьютера.
    Компьютеры работают с очень высокой скоростью, составляющей миллионы — сотни миллионов операций в секунду.
    Разнообразие современных компьютеров очень велико. Но их структуры основаны на общих логических принципах, позволяющих выделить в любом компьютере следующие главные устройства: память (запоминающее устройство, ЗУ), состоящую из перенумерованных ячеек; процессор, включающий в себя устройство управления (УУ) и арифметико-логическое устройство (АЛУ); устройство ввода; устройство вывода.
    Эти устройства соединены каналами связи, по которым передается информация.
    Основные устройства компьютера и связи между ними представлены на схеме (рис. 1).
    Жирными стрелками показаны пути и направления движения информации, а простыми стрелками
    — пути и направления передачи управляющих сигналов.

    21
    Рис. 1. Общая схема компьютера
    Функции памяти: приём информации из других устройств; запоминание информации; выдача информации по запросу в другие устройства машины.
    Функции процессора: обработка данных по заданной программе путем выполнения арифметических и логических операций; программное управление работой устройств компьютера.
    Та часть процессора, которая выполняет команды, называется арифметико-логическим устройством (АЛУ), а другая его часть, выполняющая функции управления устройствами, называется устройством управления (УУ).
    Обычно эти два устройства выделяются чисто условно, конструктивно они не разделены.
    В составе процессора имеется ряд специализированных дополнительных ячеек памяти, называемых регистрами.
    Регистр выполняет функцию кратковременного хранения числа или команды. Над содержимым некоторых регистров специальные электронные схемы могут выполнять некоторые манипуляции. Например, "вырезать" отдельные части команды для последующего их использования или выполнять определенные арифметические операции над числами.
    Основным элементом регистра является электронная схема, называемая триггером, которая способна хранить одну двоичную цифру (разряд двоичного кода). Логическая схема триггера описана в разделе 5.7.
    Регистр представляет собой совокупность триггеров, связанных друг с другом определённым образом общей системой управления.
    Существует несколько типов регистров, отличающихся видом выполняемых операций.
    Некоторые важные регистры имеют свои названия, например: сумматор — регистр АЛУ, участвующий в выполнении каждой операции; счетчик команд — регистр УУ, содержимое которого соответствует адресу очередной выполняемой команды; служит для автоматической выборки программы из последовательных ячеек памяти; регистр команд — регистр УУ для хранения кода команды на период времени, необходимый для ее выполнения. Часть его разрядов используется для хранения кода операции, остальные — для хранения кодов адресов операндов.
    В основу построения подавляющего большинства компьютеров положены следующие общие принципы, сформулированные в 1945 г. американским ученым Джоном фон Нейманом.
    1. Принцип программного управления. Из него следует, что программа состоит из набора команд, которые выполняются процессором автоматически друг за другом в определенной последовательности.
    Выборка программы из памяти осуществляется с помощью счетчика команд. Этот регистр процессора последовательно увеличивает хранимый в нем адрес очередной команды на длину

    22
    команды.
    А так как команды программы расположены в памяти друг за другом, то тем самым организуется выборка цепочки команд из последовательно расположенных ячеек памяти.
    Если же нужно после выполнения команды перейти не к следующей, а к какой-то другой, используются команды условного илибезусловного переходов, которые заносят в счетчик команд номер ячейки памяти, содержащей следующую команду. Выборка команд из памяти прекращается после достижения и выполнения команды “стоп”.
    Таким образом, процессор исполняет программу автоматически, без вмешательства человека.
    2. Принцип однородности памяти. Программы и данные хранятся в одной и той же памяти. Поэтому компьютер не различает, что хранится в данной ячейке памяти — число, текст или команда. Над командами можно выполнять такие же действия, как и над данными. Это открывает целый ряд возможностей. Например, программа в процессе своего выполнения также может подвергаться переработке, что позволяет задавать в самой программе правила получения некоторых ее частей (так в программе организуется выполнение циклов и подпрограмм). Более того, команды одной программы могут быть получены как результаты исполнения другой программы. На этом принципе основаны методы трансляции — перевода текста программы с языка программирования высокого уровня на язык конкретной машины.
    3. Принцип адресности. Структурно основная память состоит из перенумерованных ячеек; процессору в произвольный момент времени доступна любая ячейка. Отсюда следует возможность давать имена областям памяти, так, чтобы к запомненным в них значениям можно было впоследствии обращаться или менять их в процессе выполнения программ с использованием присвоенных имен.
    Компьютеры, построенные на этих принципах, относятся к типу фон-неймановских. Но существуют компьютеры, принципиально отличающиеся от фон-неймановских. Для них, например, может не выполняться принцип программного управления, т.е. они могут работать без
    “счетчика команд”, указывающего текущую выполняемую команду программы. Для обращения к какой-либо переменной, хранящейся в памяти, этим компьютерам не обязательно давать ей имя.
    Такие компьютеры называются не-фон-неймановскими.
    Команда — это описание элементарной операции, которую должен выполнить компьютер.
    В общем случае, команда содержит следующую информацию: код выполняемой операции; указания по определению операндов (или их адресов); указания по размещению получаемого результата.
    В зависимости от количества операндов, команды бывают: одноадресные; двухадресные; трехадресные; переменноадресные.
    Команды хранятся в ячейках памяти в двоичном коде.
    В современных компьютерах длина команд переменная (обычно от двух до четырех байтов), а способы указания адресов переменных весьма разнообразные. В адресной части команды может быть указан, например: сам операнд (число или символ); адрес операнда (номер байта, начиная с которого расположен операнд); адрес адреса операнда (номер байта, начиная с которого расположен адрес операнда), и др.
    Рассмотрим несколько возможных вариантов команды сложения (англ. add — сложение), при этом вместо цифровых кодов и адресов будем пользоваться условными обозначениями:
    1   2   3   4   5   6   7   8   9   ...   43


    написать администратору сайта