Пояснения к семинарским занятиям по машинным программам
Описание файла
Документ из архива "Пояснения к семинарским занятиям по машинным программам", который расположен в категории "". Всё это находится в предмете "практика расчётов на пэвм" из 1 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Онлайн просмотр документа "Пояснения к семинарским занятиям по машинным программам"
Текст из документа "Пояснения к семинарским занятиям по машинным программам"
Пояснения к семинарским занятиям по машинным программам
Общие замечания:
1) Основная цель занятий - познакомиться с особенностями архитектуры различных ЭВМ (главным образом, с теми особенностями, что имеются в ПК) с помощью составления машинных программ и моделирования на языке Паскаль работы центрального процессора.
2) Приводимые характеристики ЭВМ и системы команд соответствуют тем, что рассматриваются на лекциях (на лекциях, однако, рассказывается не обо всех командах).
3) Считается, что в ЭВМ используются только целые числа (без знака и со знаком). Операции ввода-вывода не рассматриваются; считается, что к началу выполнения программы исходные данные уже находятся в нужных ячейках, а под выводом понимается запись результата в нужную ячейку.
Тема: Машинное представление целых чисел.
План занятия:
1. Системы счисления (воспоминания).
2. Представление беззнаковых (неотрицательных) целых чисел.
3. Представление знаковых целых чисел в прямом и дополнительном кодах. Недостатки прямого кода (два представления нуля, сложение в два этапа) и достоинства дополнительного кода.
4. На примере ПК объяснить алгоритмы сложения и вычитания беззнаковых чисел и знаковых чисел в дополнительном коде и правила формирования флагов переноса (CF), переполнения (OF), знака (SF) и нуля (ZF).
5. Описать на Паскале процедуру сложения целых чисел и изменения флагов (процедуру вычитания задать на дом).
Тема: Трехадресная ЭВМ (УМ-3).
Описание УМ-3
Размер ячеек - 56 двоичных разрядов (14 шестнадцатиричных цифр)
Объем памяти - 216 ячеек;
Адреса - от 0000 до FFFF16
Представление целых чисел (каждое число - одна ячейка):
беззнаковые числа - в прямом коде,
знаковые числа - в дополнительном коде
Формат команд:
КОП А1 А2 А3 (КОП - 8 разрядов, Аi - по 16 разрядов)
Система команд:
Название КОП Операция Примечание
останов 99 стоп А1,А2,А3 - любые адреса
пересылка 00 А1 А3 А2 - любой адрес
арифметические:
сложение 01 А1+А2 А3 числа со знаком и без знака
вычитание 02 А1-А2 А3 - " -
умножение:
со знаком 03 А1*А2 А3
без знака 13 - " -
деление:
со знаком 04 А1 div А2 А3, А1 mod А2 А3+1
без знака 14 - " -
переходы:
безусловный 80 перейти к А3 А1,А2 - любые адреса
по = 81 при А1=А2 перейти к А3 числа со знаком и без знака
по 82 при А1А2 перейти к А3 - " -
по < с/зн 83 б/зн 93 при А1<А2 перейти к А3
по с/зн 84 б/зн 94 при А1А2 перейти к А3
по > с/зн 85 б/зн 95 при А1>А2 перейти к А3
по с/зн 86 б/зн 96 при А1А2 перейти к А3
Моделирование работы ЦП.
Ниже на языке Паскаль описаны процедура, моделирующая такт работы устройства управления (УУ) процессора УМ-3, и процедуры, моделирующие работу блоков сложения и вычитания целых чисел (со знаком и без знака) из арифметико-логического устройства (АЛУ) процессора.
Используемые соглашения:
1) 16-ричные числа записываются как в Турбо Паскале: $F, $6A05 и т.п.
2) Для выделения части машинного слова - с n-го разряда по k-ый (нумерация слева направо начиная с 1) - используется конструкция X[n..k]. Например, если X=$123567, то X[1..8]=$12 (=00010010b), X[9..9]=X[9]=$0.
type
машслово=0..$FFFFFFFFFFFFFF;
адрес=0..$FFFF;
var
ПАМ: array[address] of машслово; {оперативная память}
{регистры процессора:}
СА: адрес; {счетчик адреса}
РК: машслово; {регистр команды}
КОП: 0..$FF; {код операции команды}
А1,А2,А3: адрес; {адреса команды}
ОП1,ОП2: машслово; {регистры 1-го и 2-го операндов}
S: машслово; {регистр результата (сумматор)}
S1: машслово; {дополнительная часть результата (при делении)}
F1: boolean; {если true, то (S,S1) ==> (А3,А3+1) - для деления}
CF,OF,ZF,SF: 0..1; {флаги}
{блоки АЛУ:}
procedure add; forward; {S:=ОП1+ОП2 и установка флагов}
procedure sub; forward; {S:=ОП1-ОП2 и установка флагов}
procedure imul; forward; {S:=ОП1*ОП2 и установка флагов}
...
procedure divide; forward; {S:=ОП1 div ОП2; S1:=ОП1 mod ОП2; F1:=true}
{------------- такт работы УУ ---------------}
procedure cpu;
label 1, 2, 3, 999;
var omega: boolean;
begin
1: {выполнение команды по адресу из СА}
F1:=false;
РК:=ПАМ[СА]; {сама выполняемая команда}
СА:=СА+1; {адрес следующей команды}
КОП:=РК[1..8]; {КОП команды}
А1:=РК[9..24]; {1-й адрес}
А2:=РК[25..40]; {2-й адрес}
А3:=РК[41..56]; {3-й адрес}
{0-адресные команды:}
if КОП=$99 {останов} then goto 999;
{1-адресные команды:}
if КОП=$80 then {безусл. переход} begin СА:=А3; goto 3 end;
{2-адресные команды:}
ОП1:=ПАМ[А1]; {1-й операнд}
if КОП=$00 {пересылка} then begin S:=ОП1; goto 2 end;
{3-адресные команды:}
ОП2:=ПАМ[А2]; {2-й операнд}
if КОП <= $14 then {арифметические операции}
case КОП of
$01 {сложение}: add;
$02 {вычитание}: sub;
...
$14 {деление знаковых чисел}: divide; {F1:=true}
end
else {условные переходы}
begin
sub; {вычитание S:=ОП1-ОП2 и установка флагов}
case КОП of
{для чисел со знаком и без знака}
$81 {по = }: omega:=ZF=1;
$82 {по <>}: omega:=ZF=0;
{для чисел со знаком}
$83 {по < }: omega:=SF<>OF;
$84 {по >=}: omega:=SF=OF
$85 {по > }: omega:=(SF=OF) and (ZF=0);
$86 {по <=}: omega:=(SF<>OF) or (ZF=1);
{для чисел без знака}
$93 {по < }: omega:=CF=1;
$94 {по >=}: omega:=CF=0;
$95 {по > }: omega:=(CF=0) and (ZF=0);
$96 {по <=}: omega=(CF=1) or (ZF=1);
end;
if omega then СА:=А3;
goto 3;
end;
2: {запись результата в память}
ПАМ[А3]:=S; if F1 then ПАМ[А3+1]:=S1;
3: {конец такта} goto 1;
999: {останов процессора}
end; {of cpu}
{-------- блоки АЛУ сложения и вычитания целых чисел --------}
procedure add; {сложение S:=ОП1+ОП2 (чисел без знака и со знаком) и установка флагов}
var sum:0..3; i:integer;
begin
CF:=0; ZF:=1;
for i:=56 downto 1 do
begin
sum:=ОП1[i]+ОП2[i]+CF;
CF:=sum div 2; {CF - перенос в следующий (слева) разряд}
S[i]:=sum mod 2; if S[i]=1 then ZF:=0;
end;
SF:=S[1]; {знаковый бит}
{переполнение мантиссы (OF=1), если у операндов одинаковые знаки,
а у результата знак иной:}
if (ОП1[1]=ОП2[1]) and (SF<>ОП2[1]) then OF:=1 else OF:=0;
end;
procedure sub; {вычитание S:=ОП1-ОП2 (чисел без знака и со знаком) и установка флагов}
var dif:0..3;
begin
CF:=0; ZF:=1;
for i:=56 downto 1 do
begin
dif:=2+ОП1[i]-ОП2[i]-CF;
CF:=1-(dif div 2); {CF - нужен ли заем от левого разряда}
S[i]:=dif mod 2; if S[i]=1 then ZF:=0;
end;
SF:=S[1]; {знаковый бит}
{переполнение мантиссы (OF=1), если у операндов разные знаки
и знак результата совпал со знаком 2-го операнда:}
if (ОП1[1]<>ОП2[1]) and (SF=ОП2[1]) then OF:=1 else OF:=0;
end;
Программирование на УМ-3.
Возможные примеры для составления программ:
1. y:=-x5-(100x4+x)
2. c:=max(a2 mod b, -16+a2 div b)
3. По номеру некоторого года определить, високосный он или нет.
4. h, m, s - час, минута и секунда некоторого момента времени; прибавить к этому времени 1 секунду.
5. Найти наибольший общий делитель двух натуральных чисел.
6. f=n! (n0)
7. y:=1*x19+2*x18+...+19*x+20
Тема: Двухадресная ЭВМ с регистрами (УМ-Р).
Пояснения:
1) Хотя все арифметические, логические и т.п. команды по смыслу являются трехадресными, очень часто эти команды оказываются двухадресными: обычно результат команды записывается на место одного из двух первых операндов. Поэтому для сокращения размера команд можно убрать из них третий адрес и договориться, что результат записывается по 1-му (или 2-му) адресу команды: А1:=А1А2. Так получается двухадресная ЭВМ.
2) При выполнении каждой команды приходится многократно обращаться к ячейкам памяти, что замедляет выполнение команд. Сделать "быстрыми" все ячейки памяти - дорого, однако можно сделать "быстрыми" небольшое число ячеек (порядка 10-20), расположив их вне памяти, а в самом процессоре (их называют регистрами), и в основном работать с этими регистрами. Так получается регистровая ЭВМ.
3) С переходом на двухадресные команды операцию условного перехода приходится выполнять в две команды: в первой - команде сравнения - сравниваются два числа (из первого вычитается второе без записи куда-либо разности) и формируются флаги, а во второй проверяются флаги и выполняется, если надо, собственно переход.
Описание УМ-Р
Размер ячейки - 16 двоичных разрядов (4 шестнадцатиричных цифр)
Размер памяти - 220 ячеек
Адреса - от 0 до FFFFF16
Представление целых чисел: как в УМ-3, но на каждое число отводится 2 соседние ячейки (адрес числа - адрес его первой ячейки)
Имеется 16 регистров с номерами от 0 до F16
Размер регистра - 32 разрядов (= размер числа)
Форматы команд: КОП R1 A2 (регистр-память, 2 ячейки)
КОП R1 R2 (регистр-регистр, 1 ячейка)
(КОП - 8 р., R1,R2 - по 4 р., A2 - 20 р.)
Система команд (флаги меняются как в УМ-3):
(запись (A2,A2+1) обозначает число, находящееся в двух соседних ячейках - с адресами A2 и A2+1)
Название КОП Регистр-память КОП Регистр-регистр
останов 99 стоп
пересылки 00 R1:=(A2,A2+1) 20 R1:=R2
10 R1 (A2,A2+1)
арифметические:
сложение 01 R1:=R1+(A2,A2+1) 21 R1:=R1+R2
вычитание 02 R1:=R1-(A2,A2+1) 22 R1:=R1-R2
умножение:
со знаком 03 R1:=R1*(A2,A2+1) 23 R1:=R1*R2
без знака 13 - " - 33 - " -
деление:
со знаком 04 R1:=R1 div (A2,A2+1) 24 R1:=R1 div R2
(R1+1):=R1 mod (A2,A2+1) (R1+1):=R1 mod R2
без знака 14 - " - 34 - " -
сравнение 05 R1=(A2,A2+1)? 25 R1=R2?
переходы по адресу A2 (все - формата регистр-память, R1 - любой):
безусловный 80
по = 81
по 82
по < с/зн 83 б/зн 93
по с/зн 84 б/зн 94
по > с/зн 85 б/зн 95
по с/зн 86 б/зн 96
Возможные примеры для составления программ
- как для УМ-3.
Тема: ЭВМ с модификаторами (УМ-М).
Пояснения:
При работе с массивами требуется, чтобы на разных шагах цикла одна и та же команда обращалась к ячейкам с разными адресами (к разным элементам массива). Этого можно добиться, если в командах помимо адреса указывать номер некоторого регистра, а при выполнении команды формировать (исполнительный) адрес как сумму адреса, указанного в команде, и содержимого этого регистра и именно с этим адресом работать: поскольку содержимое регистра можно менять, то на разных шагах цикла одна и та же команда будет выполняться при разных адресах. Сам процесс вычисления исполнительного адреса называется модификацией адреса, а регистры, которые используются в этих целях, называются модификаторами (в УМ-М модификаторами могут быть любые регистры). Если модификатор используется для хранения индекса некоторого элемента массива, то такой регистр принято называть индексным, а модификацию адреса в таком случае - индексированием.
Описание УМ-М
УМ-М совпадает с УМ-Р, но есть следующие отличия:
1) Размер памяти уменьшается до 216 ячеек (адреса - от 0 до FFFF).
2) Меняется формат команд типа "регистр-память":
КОП R1 М2 A2 (КОП - 8 р., R1 и М2 - по 4 р., A2 - 16 р.).
Перед выполнением команды процессор вычисляет исполнительный адрес:
A2исп = (A2+[М2]) mod 216, если М20
= A2, если М2=0 (адрес не модифицируется)
и затем выполняет команду при этом исполнительном адресе (содержимое регистра-модификатора М2 рассматривается как число без знака).
3) Введена команда загрузки (исполнительного) адреса в регистр:
11 R1 М2 A2 (R1:=A2исп)
Возможные примеры для составления программ:
1. Найти максимальный элемент массива.
2. Циклически сдвинуть на одну позицию элементы массива.
3. Неотрицательные элементы некоторого массива скопировать в начало второго массива (того же размера), а отрицательные - в конец.
4. По массиву X[0..49] построить массив Y[1.48] согласно правилу:
y[i]:=x[i-1]-2*x[i]+x[i+1]
5. Проверить, симметричен ли массив.
6. Поменять местами максимальный и минимальный элементы массива.
7. Обнулить 100 ячеек, адрес первой из которых находится в регистре R4.
3