Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Зубенко, Омельчук - Програмування. Поглиблений курс

.pdf
Скачиваний:
48
Добавлен:
07.03.2016
Размер:
4.72 Mб
Скачать

Розділ ІІ. ЕЛЕМЕНТИ ІНФОРМАТИКИ

Символьне подання

 

Фактична команда

 

+/-

 

A

I

F

C

LDA 2000, 2(0:3)

+

 

2000

2

3

8

LDA 2000, 2(1:3)

+

 

2000

2

11

8

LDA 2000 (1:3)

+

 

2000

0

11

8

LDA 2000

+

 

2000

0

5

8

LDA -2000, 4

-

 

2000

4

5

8

Команда LDA 2000, 2(0:3) завантажує в регістр $А інформацію з поля (0:3) комірки з адресою 2000, проіндексованою за регістром R2.

Команди завантаження регістрів:

LDA (англ. load A – завантажити А), С=8, F =поле.

Значення *M записується в регістр $А. В операціях, де операндом є не все слово, а тільки його частина, ураховують знак, якщо він є час- тиною поля; у протилежному випадку знаком вважається +. При за- вантаженні регістра значення розташовується в його правій частині.

Якщо у F задана стандартна специфікація поля (0:5), то в регістр завантажується абсолютна величина *M зі знаком +. Якщо в полі М є команда, то завантажується її поле ±AA та в регістрі $А буде

±

0

0

0

А

А

Приклад 2.13. Припустимо, що в комірці 2000 міститься таке слово:

-

80

3

5

4

Тоді при завантаженні різних його частин отримуємо такі результати:

Команда

 

Вміст $A після операції

 

 

 

 

 

 

 

 

 

 

 

 

 

LDA 2000

-

80

 

3

5

4

LDA 2000 (1:5)

+

80

 

3

5

4

LDA 2000 (3:5)

-

0

0

80

 

3

LDA 2000 (0:3)

+

0

0

3

5

4

LDA 2000 (4:4)

+

0

0

0

0

5

LDA 2000 (0:0)

-

0

0

0

0

0

LDA 2000 (1:1)

+

0

0

0

0

7

(В останньому прикладі результат визначено не повністю, оскільки розмір байта змінний.)

LDX (англ. load $X – завантажити Х), С=15, F =поле.

Ця операція виконується аналогічно LDA, тільки замість $A заван- таження виконується в $X.

LDі (англ. load Rі завантажити Rі), 1і6. С=8 +і, F =поле.

171

ПРОГРАМУВАННЯ

Така сама операція, що і LDA, але замість $A завантаження вико- нується в Rі. Індексний регістр містить тільки два байти (а не п'ять) і знак; байти 1–3 вважаються завжди рівними 0. Дія команди LDi вважається невизначеною, якщо в ній робиться спроба занести в байти 1–3 значення, відмінне від 0.

LDAN (англ. load A negative – завантажити в $A з протилежним знаком), C =16, F =поле.

LDXN (C =23, F =поле), LDiN (C =16 +i, F =поле, 1і6)

Команди LDAN, LDXN і LDiN аналогічні відповідно командам LDA, LDX, LDi, але при завантаженні знак змінюється на протилежний.

Команди зберігання регістрів:

STA (англ. store A – запам'ятати $А), С=24, F =поле.

Вміст регістра А копіюється в комірку з адресою М на місце поля, указаного у F. Інші поля в комірці не змінюються. Із правої частини регістра обирається потрібна кількість байтів, потім вони зсуваються ліворуч, якщо це необхідно, і заносяться у відповідне поле комірки М. Якщо знак не є частиною поля, то він не змінюється. Вміст регістра

також не змінюється.

 

 

 

 

 

 

 

 

 

 

 

 

 

Приклад 2.14. Припустимо, що комірка 2000 містить

 

 

 

 

-

1

2

 

3

 

 

4

5

 

 

 

У регістрі $А міститься

 

 

 

 

 

 

 

 

 

 

 

 

 

Тоді маємо

+

6

7

 

8

 

 

9

0

 

 

 

:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Команда

 

 

Вміст $A після операції

 

 

 

 

 

+

 

 

 

 

 

 

 

 

 

 

 

 

STA 2000

 

 

6

7

 

8

 

9

 

0

 

 

 

 

 

 

 

 

 

STA 2000 (1:5)

 

-

 

6

7

 

8

 

9

 

0

 

 

STA 2000 (5:5)

 

-

 

1

2

 

3

 

4

 

0

 

 

STA 2000 (2:2)

 

-

 

1

0

 

3

 

4

 

5

 

 

STA 2000 (2:3)

 

-

 

1

9

 

0

 

4

 

5

 

 

STA 2000 (0:1)

 

+

 

0

2

 

3

 

4

 

5

 

STX (англ. store $Х запам'ятати $Х), С=31, F =поле, STi (англ. store Ri – запам'ятати Rі), C =24 +i, F =поле, 1і6.

Операції такі самі, як і STA, тільки запам'ятовується не $A, а $X та Ri.

STJ (англ. store J запам'ятати J), C =32, F =поле.

Така сама операція, що і STi, але запам'ятовується значення J і знак завжди +. У команді STJ стандартною специфікацією для поля

172

Розділ ІІ. ЕЛЕМЕНТИ ІНФОРМАТИКИ

F є (0:2), а не (0:5), і це зрозуміло, оскільки значення J майже завжди записується в адресне поле команди.

STZ (англ. store zero – обнулити поле), C =33, F = поле.

Така сама операція, що і STA, але в пам'ять записується нуль зі зна- ком + . Іншими словами, до вказаного поля комірки заноситься нуль.

Цілі арифметичні операції. В операціях додавання, віднімання, множення й ділення може мати місце специфікація поля. В арифме- тичних командах стандартною специфікацією поля є (0:5). Символом V будемо позначати специфіковане в конкретній команді поле слова з адресою М, а *V його значення.

ADD (aнгл. аdd – додавати), С=1, F =поле.

Значення *V додається до $A. Якщо абсолютне значення результату виходить за межі $А, то у тригер переповнення заноситься 1, а в $А залишається залишок результату без старшої 1 (ніби 1 перенесення пішла в інший регістр, який розташований ліворуч від А). У протиле- жному випадку стан тригера переповнення не змінюється. Якщо ре- зультат дорівнює 0, то знак $A не змінюється.

Приклад 2.15. У результаті виконання наведеної нижче послідов- ності команд буде обчислена сума п'яти байтів регістра А:

STA 2000 LDA 2000(5:5) ADD 2000(4:4) ADD 2000(3:3) ADD 2000(2:2)

ADD 2000(1:1)

SUB (англ. subtract – віднімати), С=2, F = поле.

Величина *V віднімається від $A. Як і в команді ADD, може виник- нути переповнення. Треба зазначити, що через невизначений розмір байта одна й та сама операція може викликати переповнення для од- нієї машини й не викликати для іншої.

MUL (англ. multiply – множити), С= 3, F =поле.

Обчислюється добуток *V × $A, зображений числом у 10 байтів, що розміщується в регістрах $A (старші розряди) і $X (молодші розряди). Знаки $A та $X установлюються рівними алгебричному знаку результату.

DIV (англ. divide – ділити), С= 4, F =поле.

Значення $A та $X розглядаються разом як одне десятибайтне чис- ло зі знаком, рівним знаку $A, що ділиться на значення *V. Якщо *V = 0 або частка за абсолютним значенням більше 5 байтів (це еквіва- лентно умові |$A|≥|*V|), то в регістрах $A та $X буде невизначена інфо- рмація і тригер переповнення встановиться в 1. У протилежному ви-

173

ПРОГРАМУВАННЯ

падку частка записується в $A, а залишок у $X. Після виконання операції знак $A дорівнює знаку частки, а знак $X – знаку діленого, тобто знаку $А до виконання операції.

Команди пересилання адрес. У наступних командах М викорис- товується як число зі знаком, а не як адреса комірки пам'яті.

ENTA (англ. enter A – занести в А), C =48, F =2.

Величина М заноситься в $A. Якщо М=0, то завантажується знак команди.

Наприклад, команда ENTA 0 записує в $A нуль; ENTA 0,1 установ- лює $A рівним поточному вмісту індексного регістра R1.

ENTX (англ. enter X – занести в X), С=55, F =2, ENTi (англ. enter Ri

занести в Rі), 1і6, С=48 +і, F =3.

Як і в команді ENTA, виконується завантаження відповідного регістра.

ENNA (англ. enter negative $A – занести в $А з протилежним зна-

ком), C =48, F =3, ENNХ (англ. enter negative $Х, С=48, F =3), ENNі (англ. enter negative Rі), 1і6, С=48 +і, F =3.

Виконуються так само, як і команди ENTA, ENTX, ENTi. Відмінність полягає в тому, що при завантаженні знак змінюється на протилежний.

Наприклад, команда ENN3 0,3 змінює знак R3 на протилежний.

INCA (англ. increase $A – збільшити $А), С=48, F =0.

Величина М додається до $A. Дія команди INCA еквівалентна дода- ванню до $A слова за командою ADD, яке містить величину М. Пере- повнення, що може виникнути при виконанні цієї команди, обробля- ється так само, як і в команді ADD.

Наприклад, команда INCA 1 збільшує значення $A на 1.

INCX (англ. increase $X), С=55, F =0, INCi (англ. increase Rі), 1і6, С=48 +i, F =0.

Виконуються так само, як і команда INCA. Переповнення Rі не до- зволяється. Якщо отриманий результат займає більше двох байтів, то результат операції в цьому випадку невизначений.

DECA (англ. decrease $A – зменшити $А), С=48, F =1.

Виконується як і команда INCA, тільки величина М віднімається від $A. Дія команди DECA еквівалентна відніманню від $A слова за ко- мандою SUB, яке містить величину М. Переповнення, що може вини- кнути при виконанні цієї команди, обробляється так само, як і в ко- манді SUB.

DECX (англ. decrease $X), С=55, F =1, DECi (англ. decrease Rі), 1і6, С=48 +i, F =1.

Виконуються як і команда DECA, тільки над іншими регістрами.

174

Розділ ІІ. ЕЛЕМЕНТИ ІНФОРМАТИКИ

Зазначимо, що коди операцій у командах ENTA, ENNA, INCA, DECA однакові. Щоб відрізнити ці операції, використовується поле F.

Команди порівнянь. Усі команди порівняння порівнюють зна- чення, що містяться в регістрі, зі значенням, яке міститься в пам'яті. У результаті індикатор порівняння В переходить у стан L (менше), E (дорівнює) або G (більше) залежно від того, чи буде значення регістра меншим, рівним або більшим, ніж значення в комірці пам'яті. Нуль зі знаком мінус дорівнює нулю зі знаком плюс.

CMPA (англ. compare $А порівняти $А), С=56, F =поле.

Значення вказаного поля регістра А порівнюється з тим самим по- лем у слові М. Якщо знакова позиція не входить у поле, то обидва по- ля розглядаються як додатні; у протилежному випадку при порівнян- ні до уваги береться знак. (Якщо F задано як (0:0), то завжди буде за- фіксована рівність, оскільки нуль зі знаком плюс дорівнює нулю зі знаком мінус.)

CMPХ (англ. compare $X), C =63, F =поле, CMPІ (англ. compare Ri), C =56 +i, F =поле, 1і6.

Операції аналогічні СМРА. При порівнянні в індексних регістрах байти 1–3 вважаються нульовими.

Команди переходу. Зазвичай команди виконуються в послідов- ному порядку, тобто після виконання чергової команди лічильник ко- манд РС автоматично збільшується на 1. Цю послідовність можуть порушувати команди переходу. Існує більше 20 варіантів таких ко- манд. Ми розглянемо лише кілька.

JMP (англ. jump – перестрибнути), С=39, F =0.

Безумовний перехід у лічильник РС записується М адреса на- ступної команди. Паралельно (і завжди, коли має місце той чи інший перехід, за винятком команди JSJ) у регістр J автоматично заносить- ся адреса наступної команди (тієї, яка б виконувалась за відсутності переходу).

JSJ (англ. jump – перестрибнути, не змінюючи J), С=39, F =1.

Виконується аналогічно JMP, але вміст J не змінюється.

JOV (англ. jump on overflow – перестрибнути при переповненні),

С=39, F =2.

Якщо тригер переповнення встановлено в 1, то він змінюється на 0 і виконується безумовний перехід JMP. У протилежному випадку ні- чого не відбувається.

JANZ (англ. jump on nonzero $A – перестрибнути при ненулевому $A), С=40, F =4.

175

ПРОГРАМУВАННЯ

Інші команди:

MOVE (англ. – переслати), С=7, F =число.

Група слів за адресою М (кількість їх задана в полі F) пересилається за адресою, що міститься в їхньому індексному регістрі R1. Переси- лання виконується послідовно по одному слову з одночасним збіль- шенням на 1 значення регістра R1. Таким чином, після виконання операції R1 збільшиться на величину F. Якщо F =0, то нічого не вико- нується. Особливу увагу треба приділити випадку, коли має місце на- кладання груп комірок, з якими виконується операція.

Приклад 2.16. Нехай F =3 та М=1000. Якщо *R1 =999, то переси- лається значення *1000 за адресою 999, значення *1001 – за адресою 1000, значення *1002 – за адресою 1001, і це природно. Однак якщо б *R1 =1001, то значення *1000 пересилалося б за адресою1001, потім значення *1001 – за адресою 1002 та *1002 – за адресою 1003, тобто одне й те саме слово (*1000) пересилалося б у три місця ■

SLA, SRA, SLAX, SRAX, SLC, SRC (англ. shift left A, shift right A, shift left AX, shift right AX, shift left AX circularly, shift right AX circularly –

зсунути А ліворуч, зсунути А праворуч, зсунути АX ліворуч, зсунути АX праворуч, зсунути АX ліворуч циклічно, зсунути АX праворуч ци-

клічно), C =6, F =0, 1, 2, 3, 4, 5, відповідно.

Це команди зсуву. Вони жодним чином не впливають на знаки ре- гістрів $А та $Х. Величина М указує кількість байтів, на яку зсуваєть- ся інформація ліворуч або праворуч, і повинна бути невід'ємною. Ко- манди SLA та SRA не впливають на $X. Усі інші операції зсуву впли- вають на обидва регістри так, ніби ці регістри є одним десятибайт- ним регістром. При операціях SLA, SRA, SLAX та SRAX у регістр з од- ного кінця заносяться нулі, а виштовхані з іншого кінця байти зни- кають. Команди SLC та SRC викликають циклічний зсув, при якому байти, що залишають один кінець, заходять з іншого. У циклічному зсуві беруть участь обидва регістри, $А та $Х.

NOP (англ. no operation – немає операцій), C =0.

Команда не виконує жодної дії. Величини F та М ігноруються.

HLT (англ. halt – зупинитися), С=5, F =2.

Машина зупиняється. Після того, як оператор знову запустить ма- шину, дія цієї команди буде еквівалентною NOP.

Команди керування пристроями введення-виведення. НМ має два пристрої введення-виведення: пристрій читання перфокарт і ек- ран. Кожному пристрою поставлено у відповідність номер:

176

 

 

 

Розділ ІІ. ЕЛЕМЕНТИ ІНФОРМАТИКИ

 

Номер пристрою

 

Тип пристрою

 

Розмір блока

 

 

 

 

 

 

 

16

 

Пристрій читання карт

 

16 слів

 

 

 

19

 

Екран

 

16 слів

 

 

Операції введення-виведення використовують коди літер: в одному байті міститься код однієї літери. Таким чином, у кожному слові НМ зберігається п'ять літер. Співвідношення між літерами та їхніми ко-

дами в НМ задає кодова таблиця НМ:

 

0

1

2

3

4

5

6

7

8

9

0

 

A

B

C

D

E

F

G

H

I

1

θ

J

K

L

M

N

O

P

Q

R

2

 

π

S

T

U

V

W

X

Y

Z

3

0

1

2

3

4

5

6

7

8

9

4

.

,

(

)

+

-

*

/

=

$

5

<

>

@

;

:

'

ВК

ПС

 

 

IN (введення), С= 36, F =номер пристрою.

Здійснює пересилання інформації із заданого пристрою в поле М. Пересилається один блок інформації. Номер поточного блока зберіга- ється в регістрі $X.

OUT (виведення), C = 37, F = номер пристрою.

Запис на зовнішній пристрій. Інформація, що зберігається в полі за адресою М, передається на пристрій.

Команди перетворення. Призначені для перетворення числової інформації в літерну (літерні коди) і навпаки. Використовуються в програмах разом із командами введення-виведення.

NUM (англ. convert to numeric – перетворити на число), C = 5, F = 0.

Команда перетворює літерний код на число. Значення М ігноруєть- ся. Літерний код зберігається в $АХ, у $A записується його значення.

Байти 00, 10, 20, ..., 90 трактуються як цифрa 0; байти 01, 11, 21, ..., 91 – як 1 і т. д. Величина $Х і знак А не змінюються. Можливе пере- повнення. У цьому випадку зберігається залишок за модулем розміру слова (старша цифра зникає).

CHAR (англ. convert to char – перетворити на літери), C = 5, F = 1.

Перетворення числa на літерний код призначене для виведення йо- го на перфокарту або екран. Число з $А перетворюється на десяти- байтне число в $АХ у літерній формі. Знаки А та Х не змінюються. Значення М ігнорується.

Приклад 2.17. Написати програму, яка обчислює й виводить на екран значення (a2 +b 500)/3 , де a та b числові значення комі-

177

ПРОГРАМУВАННЯ

рок 2000 та 2001. При переповненні друкує символ ‘*'. Програму роз- містити за адресою 0050.

Щоб за командою OUT вивести результат, необхідно попередньо сформувати його літерну форму в певному вихідному полі. Мінімаль- на довжина такого поля 16 слів (1 блок). Нехай 2004 буде адресою ви- хідного поля. Спочатку вихідне поле обнулюється (нагадаємо, що в НМ нуль є кодом символу-пробілу). Потім у словах 2004 та 2005 про- грама формує літерне подання результату.

 

Команда

Коментар

 

50

STZ 2004

Обнулення комірки 2004

 

51

ST1 2005

Підготовка $R1 для команди MOVE

 

52

MOVE 2004(15)

Обнулення вихідного поля

 

53

LDA 2000

$A a

(*2000)2

54

MUL 2000

$AХ ← a×a

55JANZ 0070 Переповнення при обчисленні a×a

56STX 2002 Вивантажити a×a у слово 2002

57

LDA 2001

$A b

 

 

58

SUM 2002

$А← a×a + b

 

 

59

JOV 0070

Переповнення при обчисленні a×a +b

 

 

60

DECA 500

$А← a×a + b – 500

 

 

61

SRAX 5

Зсув $А у $Х

 

 

62

ENT1 3

$R13

 

 

63

ST1 2002

Записати 3 у комірку 2002

 

 

64

DIV 2002

$Aa×a + b – 500/3

 

 

65

JOF 0070

Переповнення при діленні

 

 

66

CHAR (1)

$AХ ← літерну форму $А

 

67

STA 2004

Запис $А у слово 2004

68

STX 2005

Запис $X у слово 2005

 

69

JUMP 0073

Перехід на виведення результату

 

70

ENTA 46

Заносить у п'ятий байт $A число 46

 

 

 

(код ‘*')

 

71

SLA 4

Зсуває ‘*' у перший байт $A

 

72

STA 2004

Заносить ‘*' у вихідне поле

 

73

OUT 2004 (16)

 

 

 

74

HLT

 

 

 

Приклад 2.18. У комірці 0200 міститься слово. Отримати його дзе- ркальне відображення.

Розв'язок 1. Результат отримаємо в регістрі $A:

178

Розділ ІІ. ЕЛЕМЕНТИ ІНФОРМАТИКИ

Адреса

Команди

1000

LDA 0200(1;1)

1001

SRAX 1

1002

LDA 0200(2;2)

1003

SRAX 1

1004

LDA 0200(3;3)

1005

SRAX 1

1006

LDA 0200(4;4)

1007

SRAX 1

1008

LDA 0200(5;5)

1009

SRAX 1

1010

SLAX 5

Розв'язок 2.

 

Команди

Коментар

1000

ENT1 4(2)

 

1001

JIN 1007

 

1002

LDA 0200

 

1003

SRA 0,1

Тіло циклу

1004

SRAX 1

1005

DEC 1

 

1006

JMP 1001

 

1007

SLAX 5

 

Приклад 2.19. Написати вірусну програму, що в усі 4000 слів па- м'яті запише команду HLT (C =5, F =2).

Розв'язок 1. Вірусна програма складається з десяти команд і роз- ташовується в останніх комірках ОП.

 

Команди

Коментар

3990

ENT1 0

Підготовка $R1 для команди MOVE

3991

ENT2 999

 

3992

J2Z 3999

 

3993

MOVE

Пересилання чотирьох слів із командою HLT за

 

3996(4)

адресою R1

3994

DEC2 1

Зменшення параметра циклу

3995

JMP 3992

Перехід на початок циклу

3996

HLT

 

3997

HLT

 

3998

HLT

 

3999

HLT

 

179

ПРОГРАМУВАННЯ

Нагадаємо, що за допомогою команди MOVE можна одноразово переслати до 63 слів. Ми пересилаємо одночасно по чотири команди HLT. Після повторення 998 разів тіла циклу будуть заповнені комірки від 0 до 3991, а при останньому 999-му виконанні тіла комірки 3992–3995 із cамим циклом.

Розв'язок 2. Вірусна програма складається з п'яти команд і теж розташовується в останніх комірках ОП.

 

Команди

3995

ENT1 0

3996

MOVE 3998(2)

3997

JMP 3986

3998

HLT

3999

HLT

*Література для CР: обчислювальні системи [68, 110, 115, 117, 122]; машинна арифметика – [19, 60]; навчальна машина – [58, 59].

Контрольні запитання та вправи

1.Охарактеризувати загальну структуру комп'ютера.

2.Яка роль лічильника команд у архітектурі процесора?

3.Які функції ОС?

4.Що таке драйвер?

5.Що таке командний процесор?

6.Що таке утиліта?

7.Перерахуйте основні функції системи програмування.

8.Що таке текстовий редактор?

9.Яка різниця між компілятором та інтерпретатором? 10. Яка функція налагоджувача?

11. Що таке об'єктний модуль?

12. Яка роль редактора зв'язків і завантажника в системах про- грамування?

13. Що таке числа з фіксованою й рухомою точками? 14. Що таке мантиса й порядок РТ-числа?

15. Що таке нормалізоване подання РТ-числа?

16. Знайти двійкові й шістнадцяткові записи десяткових чисел: 15, 255, 256, 32767, 32768, 65537 та 65538.

17. Знайти десяткові й шістнадцяткові записи двійкових чисел: 1100, 1111, 11111111, 1 000 0000, 100 0000 0000.

18. Знайти двійкові й десяткові записи шістнадцяткових чисел: FF2, ABCD, 77F, 1000.

180