Команди арифметичних операцій

АDD.B (A3),D2 ; Додавання молодшого байта регістра D2

; до вмісту комірки пам’яті, яка є

; адресована А3

ADDA D3,A0 ; Додавання слова з А0 до слова у D3,

; результат записується до А0

АDDI #$1234,(A3)+ ; Додавання слова з комірок пам’яті, які

; мають адреси (А3) та (А3) + 1,

; до числа $1234, після чого до вмісту А3

; додається число 2

ADDQ.L #8,(22,A3) ; Довге слово з комірок пам’яті, які є

; адресовані вмістом (А3) + 22, (А3) + 23,

; (А3) + 24 та (А3) +25, додається до даного

; 8, результат записується за цими ж

; адресами, швидке додавання

АDDX -(A3),-(A4) ; Перед додаванням адреси комірок пам’яті

; А3 та А4 зменшуються на 2, після чого

; до вмісту комірки пам’яті, адресованої А4,

; додається вміст комірки пам’яті,

; адресованої А3, та значення прапорця Х

SUB.L #1,D0 ; Віднімання від вмісту 32-розрядного

; регістра D0 одиниці

SUBA.L #$400,A6 ; Віднімання від довгого слова, яке

; вміщується у адресному регістрі А6,

; безпосереднього даного $400

SUBI #250,(A6)+ ; Віднімання від слова, розташованого у

; комірках пам’яті з адресами А6 та

; А6 + 1, десяткового даного 250; після

; операції вміст А6 збільшиться на 2

SUBQ.L #2,A2 ; Швидке віднімання безпосередньо

; заданого операнда, який не може

; перевищувати 3-х розрядів

NEG D0 ; Віднаходження доповнення до 2 – D0: =

; ( Команди арифметичних операцій - №1 - открытая онлайн библиотека ) + 1, знак даного змінюється

СMP (A4),D7 ; Порівняння вмісту регістра D7 із вмістом

; комірки пам’яті, яка адресується (А4), за

; рахунок внутрішнього віднімання,

; результат нікуди не записується, а

; виставлені прапорці використовуються

; для реалізації розгалужень

СMPM.B (A0)+,(A1)+ ; Порівняння відповідних однобайтових

; елементів масивів, адресованих вмістом

; А0 та А1; при виконуванні команди від

; елементів масиву (А1)+ віднімаються

; елементи масиву (А0)+

Команди додавання та віднімання встановлюють усі прапорці залежно від здобутого результату, окрім прапорця Х.

MULS (A3),D2 ; Множення зі знаком слова з D2 на слово, яке є

; розташоване у комірках пам’яті, адресованих

; вмістом А3 та А3 + 1; 32-розрядний результат

; розміщується у регістрі D2

MULU (A3),D0 ; Множення без знаку слова з регістра D0 на слово,

; розташоване у пам’яті, адресу якого зазначено у

; регістрі А3; 32-розрядний результат розміщується

; в регістрі D0

DIVS D1,D3 ; Ділення зі знаком довгого слова з D3 на довге

; слово, розміщене у D1; біти результату

; розміщуються у бітах D0...D15 регістра D3, а

; стача – у бітах D16...D31 регістра D3

DIVSL D1,D3 ; Ділення зі знаком довгого слова з D3 на довге

; слово, розміщене у D1; біти результату

; розміщуються у бітах D0...D31 регістра D3, а

; стача губиться

Розширення набору команд 32-розрядних процесорів пов’язано із введенням нових груп команд, які забезпечують операції з бітовими полями, поширюють групу арифметичних та інших операцій, а також команд, які забезпечують роботу зі співпроцесором.

Команди пересилань з регістрів ССR та SR та їхнє завантаження мають вигляд

MOVЕ CCR,D3 ; Пересилання вмісту регістра ССR у D3

MOVЕ #0,CCR ; Обнулення регістра CCR

MOVЕ SR,D0 ; Пересилання вмісту регістра SR у D0

MOVЕ #$700,SR ; Встановлення маски пріоритетів переривань, яка

; дорівнює 7

Команди обміну поміж вказівником стека користувача USP та адресним регістром мають вигляд

MOVЕ USP,A0 ; Пересилання вказівника стека USP до А0

MOVЕ A7,USP ; Задання вказівника стека

Команди множення 32-розрядних операндів мають вигляд

MULS.L (A3),D2 ; Множення зі знаком 32-розрядного даного з D2 на

; 32-розрядне дане, адресоване A3; результат

; записується до D2; якщо він перевищує

; 32 розряди, встановлюється прапорець V = 1

; до CCR

MULS.L (A3),D2:D3 ; Множення зі знаком 32-розрядного даного з D3 на

; 32-розрядне дане, адресоване A3; 64-розрядний

; результат записується до регістрової пари D2:D3,

; старші 32 біти – до D2, молодші – до D3

Команди MULU та MULS, відповідно беззнакове множення та множення зі знаком, встановлюють такі прапорці:

N = 1, якщо результат є від’ємний;

Z = 1, якщо результат дорівнює нулю;

V = 1, якщо переповнення є;

С = 0, завжди;

Х – не встановлюється.

Команди ділення 64-розрядного операнда на 32-розрядний дільник:

DIVSL D1,D2:D3 ; Ділення зі знаком 64-розрядного операнда з

; регістрової пари D2:D3 на 32-розрядний операнд

; з D1; 64-розрядний результат записується до

; регістрової пари D2:D3, старші 32 розряди – до D2,

; молодші – до D3

DIVSL.L D1,D2:D3 ; Ділення зі знаком 32-розрядного операнда з D3 на

; 32-розрядний операнд з D1; 32-розрядний

; результат – біти 0...31 – записуються до D3, а

; стача – біти 0...31 – до регістра D2

Команди DIVU та DIVS, відповідно беззнакове ділення та ділення зі знаком, встановлюють такі прапорці:

N = 1, якщо частка є від’ємна, та N є невизначений, якщо є переповнення або ділення на нуль;

Z = 1, якщо частка дорівнює нулю;

V = 1, у разі переповнення;

С = 0, завжди;

Х – не змінюється.

Команди бітових операцій наводяться у табл. 12.1. Якщо операнд розміщено у регістрі даних, він трактується як довге слово, якщо у комірці пам’яті, – як байт. Номер тестованого біта задається вмістом регістра Dn або безпосереднім операндом Nb. Значення Z = 1 встановлюється, якщо тестований біт bn = 0, і Z = 0, якщо bn = 1.

Команда BTST зберігає значення тестованого біта незмінним, команда BSET після тестування встановлює значення bn = 1, а команда BCLR – значення bn = 0. Команда BCHG інвертує значення біта bn після тестування.

Зазначені команди можуть виконуватися на МП МС68000 та МС68020.

У МП68020 введено також нову групу команд, яка виконує операції з бітовими полями, довжиною до 32-х бітів. Для обрання бітового поля <bf> у команді зазначається ефективна адреса ЕА операнда, зміщення Оf, яке визначає номер молодшого (першого) біта в полі <bf>, а також розмір поля Wf (кількість бітів у полі). При виконуванні кожної з цих команд у регістрі CCR встановлюються ознаки N, Z, які схарактеризовують вміст зазначеного поля <bf>: ознака N набирає значення старшого біта поля, ознака Z = 1 встановлюється, якщо усі біти поля мають значення 0. Ознаки С та V обнулюються, Х не змінюється. Після встановлення ознак команда BFCHG інвертує значення бітів у полі <bf>, команда BFCLR заповнює поле нулями, команда BFSET – одиницями. Команда BFTST тільки встановлює ознаки і не змінює значення бітів. Команди BFEXTS та BFEXTU завантажують обране бітове поле до регістра Dn з розширенням його до 32-х розрядів знаком або нулями. Команда BFINS виконує обернену процедуру і пересилає Wf молодших розрядів з регістра Dn до зазначеного бітового поля. Команда BFFFO визначає Nb – номер першого біта у полі <bf>, який має значення 1, і заносить цей номер до регістра Dn.

Таблиця 12.1 – Команди бітових операцій

Синтаксис Асемблера Розрядність Операції Адресування
BTST Dn,<EA> B, L Команди арифметичних операцій - №2 - открытая онлайн библиотека ® Z Dn – регістрове, операнда – усі види
BTST #Nb, <EA> B, L Команди арифметичних операцій - №2 - открытая онлайн библиотека ®Z Nb – безпосереднє, операнда – усі види
BSET Dn, <EA> B, L Команди арифметичних операцій - №2 - открытая онлайн библиотека ®Z, 1®bn Dn – регістрове, операнда – усі види
BSET #Nb, <EA> B, L Команди арифметичних операцій - №2 - открытая онлайн библиотека ®Z, 1®bn Nb – безпосереднє, операнда – регістрове, непряме регістрове, відносне, відносне з індексуванням
BCLR Dn, <EA> B, L Команди арифметичних операцій - №2 - открытая онлайн библиотека ®Z, 0®bn Dn – регістрове, операнда – регістрове, непряме регістрове, відносне, відносне з індексуванням
BCLR #Nb, <EA> B, L Команди арифметичних операцій - №2 - открытая онлайн библиотека ®Z, 0®bn Nb – безпосереднє, операнда – регістрове, непряме регістрове, відносне, відносне з індексуванням
BCHG Dn, <EA> B, L Команди арифметичних операцій - №2 - открытая онлайн библиотека ®Z, Команди арифметичних операцій - №2 - открытая онлайн библиотека ®bn Dn – регістрове, операнда – регістрове, непряме регістрове, відносне, відносне з індексуванням
BCHG #Nb, <EA> B, L Команди арифметичних операцій - №2 - открытая онлайн библиотека ®Z, Команди арифметичних операцій - №2 - открытая онлайн библиотека ®bn Nb – безпосереднє, операнда – регістрове, непряме регістрове, відносне з індексуванням

Значення зміщення й розміру поля {Оf:Wf} можуть задаватися у команді безпосередньо числами або зазначатися вмістом регістрів даних як Оf та Wf, наприклад: {D1:D2} або {10:D3}. Значення Wf повинні перебувати у діапазоні 0…31, а Wf = 0 визначає розмір поля у 32 біти. Значення Оf, яке задається безпосередньо, також повинне бути у діапазоні 0…31. Якщо для віднайдення Оf зазначається регістр даних, то його вміст трактується як число зі знаком.

Приклади команд бітових операцій:

BFCHG D1{#6: #3}

Команда інвертує 3 біти числа, яке вміщено до регістра D1, розпочинаючи з 6-го біта ліворуч.

MOVEA.L #400700,A4 ; Завантаження адреси до регістра А4

CLR.L (A4) ; Обнулення комірки пам‘яті за ЕА = (А4)

MOVEQ #10,D0 ; Завантаження номера першого

; перетворюваного біта до D0

MOVEQ #15,D1 ; Завантаження кількості перетворюваних

; бітів до D1 (F)

BFCHG (A4) {D0: D1} ; Інвертування бітів

До виконання команди BFCHG комірку пам‘яті було обнулено. Після виконання цієї команди у комірці буде число

00 0000 0011 1111 1111 1111 1000 0000 B=$003FFF00

BFCLR ([$400700]){#2: #10}

Команда обнулить поле у 16 бітів довжиною, розпочинаючи зі зміщення 2 біти у довгому слові з адресою $400700.

BFEXTS ($400600,A0){D0: D1},D2

З комірки пам‘яті за адресою ($400600,A0) бітове поле, розпочинаючи зі зміщення, зазначеного у D0, і довжиною у кількість бітів, зазначену у D1, завантажується до регістра D2 і поширює знак до 32-х бітів.

BFEXTU D1{#0: #1},D2

Команда пересилає з регістра D1 один біт, розпочинаючи зі зміщення 0 до регістра D2, і заповнює нулями інші розряди.

BFINS D2,D3{#2:#$10}

Команда пересилає $10 молодших розрядів з регістра D2 у задане бітове поле регістра D3, розпочинаючи з другого розряду ліворуч. Якщо регістр D2 вміщує число $FFFFFFFF, а регістр D3 – усі нулі, то після виконання команди регістр D2 вміщуватиме число $FFFFFFFF, а регістр D3 – число $3FFFC000.

BFSET D1{D2:D3}

Команда встановлює одиниці у бітах числа, яке вміщується у D1, розпочинаючи зі зміщення (D2) у кількості (D3).

BFTST D0{$10:#4}

Команда тестує біти з b4 по b7 операнда довжиною у слово в регістрі D0. Якщо всі біти обнулено, у регістрі CCR встановлюється ознака Z = 1, якщо b7 дорівнює 1, встановлюється ознака N у регістрі CCR.


Команди логічних операцій

AND.B D1,D3 ; Операція логічного ТА над молодшими

; байтами операндів , розташованих у D1

; та D3; результат записується до D3

ANDI #$FBFB,SR ; Задання маски переривань відповідно до

; рівня 4

ОRI.B #4,CCR ; Встановлення біта Z = 1 у регістрі

; прапорців ССR

EOR.L DO,D2 ; Виконання операції виключного АБО над

; довгими словами, які зберігаються у D2 та

; D0

EORІ.B #$55,$400700.L ; Інвертування парних бітів у байті, який

; зберігається у комірці пам’яті з адресою

; $400700

Прапорець N у регістрі ССR при виконуванні логічних операцій встановлюється залежно від знаку результату. Прапорець Z = 1, якщо результат є нульовий . Прапорці V та C завжди встановлюються такими, що дорівнюють нулю. Прапорець Х не змінюється.

Команди зсувів

Команди арифметичних та логічних зсувів зреалізовуються за схемами рис. 12.3...12.5:

 
  Команди арифметичних операцій - №12 - открытая онлайн библиотека

Рисунок 12.3 – Арифметичний та логічний зсуви ліворуч

(команди ASL, LSL)

 
  Команди арифметичних операцій - №13 - открытая онлайн библиотека

Рисунок 12.4 – Арифметичний зсув праворуч (команда ASR)

 
  Команди арифметичних операцій - №14 - открытая онлайн библиотека

Рисунок 12.5 – Логічний зсув праворуч (команда LSR)

Команди циклічних зсувів зреалізовуються за схемами рис. 12.6...12.9:

 
  Команди арифметичних операцій - №15 - открытая онлайн библиотека

Рисунок 12.6 – Циклічний зсув ліворуч (команда ROL)

 
  Команди арифметичних операцій - №16 - открытая онлайн библиотека

Рисунок 12.7 – Циклічний зсув праворуч (команда ROR)

 
  Команди арифметичних операцій - №17 - открытая онлайн библиотека

Рисунок 12.8 – Циклічний зсув ліворуч через прапорець Х

(команда ROXL)

 
  Команди арифметичних операцій - №18 - открытая онлайн библиотека

Рисунок 12.9 – Циклічний зсув праворуч через прапорець Х

(команда ROXR)

Кількість розрядів, на яку зреалізовується зсув, записується або безпосередньо у команді (1...8) або у регістрі даних, лічильнику зсувів. Операнд, який записано у пам’яті, можна зсувати тільки на 1 біт і його розмір має бути не більше за слово.

ASR #3,D4 ; Арифметичний зсув молодшого слова у регістрі

; D4 праворуч на 3 розряди

ASL.L D0,D6 ; Зсув ліворуч довгого слова у регістрі D6 на

; кількість розрядів, зазначену у D0

ASR (-2,A3,D2,L) ; Зсув праворуч на один розряд слова, яке

; зберігається у комірках пам’яті, ефективну

; адресу першої зазначено за типом “непряме

; регістрове адресування зі зміщенням та

; індексуванням” та наступною

За арифметичного та логічного зсувів ліворуч за допомогою команд ASL та LSL молодші розряди операнда, які звільнюються, заповнюються нулями. За арифметичного зсуву праворуч за допомогою команди ASR старші розряди операнда, які звільнюються, заповнюються значенням його старшого (знакового) розряду. Це дозволяє зберегти значення знаку та форми подання операнда (двійковий код або доповняльний код). За логічного зсуву праворуч за командою LSR старші розряди операнда заповнюються нулями. При виконанні команди ASL значення V = 1 встановлюється, якщо відбулося хоча б одне змінення знакового розряду за кількох зсувів. За виконання команди ASR старший розряд не змінюється. За виконання усіх видів циклічних зсувів останній розряд операнда, що він висувається, зберігається як прапорець С.