Главная страница

 

ДОМ
ИНФОРМАЦИОННЫХ ТЕХНОЛОГИЙ

Информатика и программирование
Информационные технологии
Компьютерные сети
Информационная безопасность
Как заработать в сети Интернет
Информационные технологии
CASE-технологии
Программные средства
Низкоуровневое программирование
Модели данных
Структуры данных
Низкоуровневое программирование

ОПЕРАТОРИ ДЛЯ ЗАПИСУВАННЯ АЛГОРИТМІВ ЛІНІЙНИХ ПРОЦЕСІВ

 

Програмна модель МП

Нагадаємо, що сукупність регістрів МП, до якої мають доступ програмісти, називають програмною моделлю МП. На рис. 1 представлено програмна модель 16-розрядного МП і8086.

Рисунок 1 - Програмна модель 16-розрядного МП і8086

Програмна модель 32-розрядних процесорів Intel (див рис. 2) є спільною для всіх існуючих на даний момент 32-розрядних процесорів: 80386, 486, Pentium, Pentium Pro, Pentium II і Celeron.

Рисунок 2 - Основні регістри 32-розрядних процесорів

Регістри загального призначення 32-розрядних мікропроцесорів включають відповідні регістри 16-розрядних процесорів, але тут вони мають 32 розряди. До попереднього позначення їх імен додалась приставка e (Extended - розширений). Відсутність приставки в імені означає посилання на молодші 16 біт розширених регістрів. Можливе незалежне звертання до молодшого і старшого байтів регістрів ах, вх, сх, . Розрядність операнду даних може складати 1, 8, 16, 32 або 64 біт, бітового поля 1-32 біта, адреси 16 або 32 біта.

Вказівник команд eip містить зміщення наступної команди, що виконується, відносно бази сегменту коду. При 16-бітній адресації використовуються тільки молодші 16 біт (ip).

32- розрядні процесори можуть працювати в одному з двох режимів і переключатись між ними достатньо швидко як в один, так і в інший бік. Режим реальної адресації повністю сумісний з і8086. В цьому режимі можлива адресація до 1 Мб фізичної пам'яті. Захищений режим віртуальної адресації дозволяє адресувати до 4 Гбайт фізичної пам'яті і більше.

Оператори (команди) пересилання

Команди пересилання даних дозволяють переслати (скопіювати) вміст джерела в приймач. Вміст приймача безповоротно зникає, вміст джерела не змінюється. Мнемонічне позначення команди пересилання - mov. Загальна форма записування така:

   mov  <приймач>, <джерело>.
      

В якості приймача може використовуватися регістр (r) або комірка пам'яті (m). В якості джерела може також використовуватися регістр або комірка пам'яті, крім того джерелом може бути константа (data), яка записується просто як частина команди.

У таблиці 1 представлено формат команд пересилання даних і їх призначення. Більш повний перелік даних команд можна знайти в [10].

Таблиця 1

Формат

Призначення

mov r1, r2

[r2] -> [r1], пересилання вмісту регістра r2 у регістр r1

mov r, m

[m] -> [r], пересилання вмісту комірки ОП у регістр МП

mov m, r

[r] -> [m], пересилання вмісту регістра МП у комірку ОП

mov r, datа

[datа] -> [r], пересилання константи datа у регістр МП

При записуванні команд пересилання даних потрібно слідкувати, щоб тип операндів, які пересилаються, співпадали. Так, наприклад, простими командами пересилання неможливо переслати вміст 8-розрядного регістра у 16-розрядний або 32-розрядний. В посібнику в подальшому у всіх прикладах робота з 16-розрядними регістрами.

Приклади команд пересилання даних:

Таблиця 2

mov ax, bx

[bx] -> [ax], пересилання вмісту регістра bx у регістр ax

mov ax, [120]

[m] -> [r], пересилання вмісту комірки ОП, що знаходиться у сегменті даних із зміщенням 120, у регістр ax МП

mov a, ax

[ax] -> [m], пересилання вмісту регістра ax МП у комірку ОП із іменем a

mov al, 8

8 -> [al], пересилання константи 8 у регістр al МП

 

Оператори (команди) додавання

В мові Асемблера є декілька команд для виконання додавання [10]. Формат команди додавання add такий:

   add <приймач>, <джерело>.
      

Команда add (табл. 3) додає вміст приймача до вмісту джерела і зберігає результат в приймачу, тобто виконує таку дію:

   <приймач> = <приймач> + <джерело>.
      

Таблиця 3

Формат

Призначення

add r1, r2

[r1] + [r2] -> [r1], до вмісту регістра r1 додається вміст регістра r2 і результат записується у регістр r1

add r, m

[r] + [m] -> [r], до вмісту регістра r додається вміст комірки ОП і результат записується у регістр r

add m, r

[r] + [m] -> [m], до вмісту регістра r додається вміст комірки ОП і результат записується у комірку ОП

add r, datа

[r] + [datа] -> [r], до вмісту регістра r додається константа datа і результат записується у регістр r

Приклади команд додавання:

Таблиця 4

add ax, bx

[ax] + [bx] -> [ax]

add al, 15

[al] + 15 -> [al]

add [120], r

[r] + [120] -> [120]

add al, bh

[al] + [bh] -> [al]

 

Оператори (команди) віднімання

У системі команд мікропроцесорів сімейства і80х86 існують аналогічні командам додавання команди віднімання [10]. Формат команди віднімання sub такий:

   sub <приймач>, <джерело>.
      

У команді sub (табл. 5) від вмісту приймача віднімається вміст джерела і результат розміщується в приймачу:

   <приймач> = <приймач> - <джерело>.
      

Таблиця 5

Формат

Призначення

sub r1, r2

[r1] - [r2] -> [r1], від вмісту регістра r1 віднімається вміст регістра r2 і результат записується у регістр r1

sub r, m

[r] - [m] -> [r], від вмісту регістра r віднімається вміст комірки ОП і результат записується у регістр r

sub m, r

[m] - [r] -> [m], від вмісту комірки ОП віднімається вміст регістра r і результат записується у комірку ОП

sub r, datа

[r] - [date] -> [r], від вмісту регістра r віднімається константа date і результат записується у регістр r

 

Оператори (команди) множення

У складі команд мікропроцесора є дві команди множення, які можна використовувати для множення цілих чисел без знаку mul та множення цілих чисел із знаком іmul.

Оператори можуть містити 1, 2, 3 операнди. Розглянемо випадок з одним операндом.

Приклад 1.

mul r

;перший операнд міститься у 8-розрядному регістрі (або у байті пам'яті, якщо mul m), другий операнд міститься у регістрі al, результат записується у регістр ax.

Приклад 2.

mul r

;перший операнд міститься у 16-розрядному регістрі (або у двох байтах пам'яті, якщо mul m), другий операнд міститься у регістрі ax, результат записується у два 16-розрядні регістри [ dx : ax ] - старша частина результату у регістр dx, молодша частина результату у регістр ax

Приклад 3.

mul bx

;перший операнд міститься у 16-розрядному регістрі bx, другий операнд міститься у регістрі ax, результат записується у регістри [dx : ax]

Приклад 4.

mul bl

;перший операнд міститься у 8-розрядному регістрі bl, другий операнд міститься у регістрі al, результат записується у регістр ax

Оператори (команди) ділення

У системі команд МП і80х86 можна виконати операції:

   div - беззнакового ділення;
      
   idiv - знакового ділення.
      

Оператори можуть містити тільки один операнд. Якщо операндом є 8-розрядний регістр (наприклад div r), то ділиме знаходиться у регістрі ax, дільник урегістрі r, частка записується в al, остача - ah.

Якщо операндом є 16-розрядний регістр (наприклад div r), то

   ділиме - в [dx : ax]
      
   дільник - в [r]
      
   частка - в [ax]
      
   остача - в [dx]
      

Приклад програми обчислення арифметичного виразу на мові Асемблера

Завдання.
Записати на мові Асемблера обчислення арифметичного виразу:

Примітка. Оперуємо з 16-розрядними регістрами. Розподілення даних по коміркам сегмента даних виконуємо самі. Пам'ятаємо, що адресою слова є адреса молодшого байта.

Розподілення пам'яті

 

Текст програми на Асемблері

Таблиця 6

Адреса комірки

Вміст

120

a

121

122

b

123

123

c

125

126

d

127

128

x

128

 

Таблиця 7

Мнемоніка оператора

Примітка

mov ax, [122]

b -> [ax]

sub ax, [124]

[ax] - c -> [ax]

mov bx, [126]

d -> [bx]

idiv bx

[ax] : [bx] -> [ax]

add ax, [120]

[ax] + a -> [ax]

mov bx, 3

3 -> [bx]

imul bx

[ax] · [bx] -> [dx:ax]

mov [128], ax

[ax] -> x

Hlt

Зупин.

 

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

  1. Вкажіть призначення оператора MOV ax, bx.
  2. Запишіть оператор Асемблера, який реалізує додавання до вмісту комірки пам'яті [200] вміст регістра cx. Результат записується у комірку [200].
  3. Вкажіть призначення оператора MOV dx, [130]
  4. Запишіть оператор Асемблера, який реалізує додавання до вмісту регістра ах шістнадцятирозрядної константи А00А. Результат записується у регістр ах.
  5. Вкажіть призначення оператора MOV [150],cx.
  6. Запишіть оператор Асемблера, який реалізує віднімання від вмістимого регістра cx вмістиме регістра ах. Результат записується у регістр сх.
  7. Вкажіть призначення оператора mov bx, 000A.
  8. Запишіть оператор Асемблера, який реалізує віднімання від вмістимого регістра аx вмістиме комірки пам'яті [123]. Результат записується у регістр ах.
  9. Вкажіть призначення оператора Add ax,cx.
  10. Запишіть оператор Асемблера, який реалізує віднімання від вмістимого комірки пам'яті [160] вмістиме регістра сх. Результат записується у комірку [160].
  11. Запишіть на Асемблері арифметичний вираз S=b-10+c
  12. Вкажіть призначення оператора Add ax, [120].
  13. Запишіть оператор Асемблера, який реалізує віднімання від вмістимого регістра ах шістнадцятирозрядної константи АС00. Результат записується у регістр ах.
  14. Запишіть на Асемблері арифметичний вираз S=(a+b)/15

Розподілення пам'яті:

Адреса комірки

Вміст

140

a

142

b

200

S

  1. Запишіть на Асемблері арифметичний вираз S=a+b-15

Розподілення пам'яті:

Адреса комірки

Вміст

140

a

142

b

200

S

  1. Запишіть на Асемблері арифметичний вираз S=a-b+13

Розподілення пам'яті:

Адреса комірки

Вміст

136

a

138

b

120

S

  1. Запишіть на Асемблері арифметичний вираз S=a+2*b

Розподілення пам'яті:

Адреса комірки

Вміст

130

a

132

b

134

S

 

Copyright © Eugene, 2007
e-mail: webmaster@ITDom.info
Rambler's Top100 Рейтинг@Mail.ru