Синтаксис Асемблера має вигляд
([bd,An],Ri.s*SCALE,od),
де bd – базове зміщення; Ri.s*SCALE – значення індексного регістра An або Dn, яке множиться на масштабний множник SCALE – 1, 2,4 або 8; od – вихідне зміщення; s – символ розрядності індексного регістра, може дорівнювати W або L. Вміст індексного регістра Ri.s трактується як число зі знаком і у разі s = W знак поширюється на 32 розряди.
Наприклад, запис A 3. W* 2 означає, що за індекс у команді слугує вміст 16-ти молодших розрядів регістра адреси А 3, зсунутий на один розряд ліворуч та розширений знаком до 32-х розрядів.
Команда
CLR ([$1234, A 2], D 3. L,$5678)
очищуватиме комірку пам’яті з ефективною адресою ЕА, яка підраховується в такий спосіб. Припустимо, що вміст регістра А 2 становить $400600, а регістра D 3 – відповідно $1000. Частина ефективної адреси ЕА, подана у квадратних дужках, має вигляд
|
$001234
$401834
Припустимо, що за цією адресою у пам’яті зберігається число $600600. Тоді повна ефективна адреса, зазначена у команді, матиме вигляд
ЕА = $600600 + $1000 + $5678 = $606C78.
Внаслідок виконання команди буде обнулено 16 молодших розрядів даного, яке зберігається у пам’яті, розпочинаючи з адреси $606C78.
Непряме регістрове адресування з преіндексуванням
Синтаксис Асемблера має вигляд
([bd,An,Ri.s*SCALE],od)
Ефективна адреса ЕА підраховується аналогічно до попереднього способу.
Команда
CLR ([$1234, A 2, D 3. L ]$5678)
очищуватиме комірку пам’яті з ефективною адресою ЕА, частина якої, подана у квадратних дужках, матиме вигляд
$400600 + $1234 + $1000 = $402834.
Припустимо, що, розпочинаючи з цієї адреси, у пам’яті зберігається довге слово $600600, тоді
ЕА = $600600 + $5678 = $605 С 78.
Внаслідок виконання команди буде обнулено 16 молодших розрядів даного, яке зберігається у пам’яті, розпочинаючи з адреси $605 С 78.
Непряме відносне адресування з індексуванням
Синтаксис Асемблера має вигляд
(*+d,PС,Ri.s*SCALE)
або
(ххх,PС,Ri.s*SCALE).
За вміст PС вважається адреса наступної команди.
За непрямого відносного адресування з постіндексуванням та преіндексуванням ефективна адреса формується як за непрямого регістрового адресування, але замість вмісту регістра Аn використовується вміст програмного лічильника PС:
ЕА = [PС + bd] + (Xn) * SCALE + od – у разі постіндексування
EA = [PС + (Xn) * SCALE + bd] + od – у разі преіндексування
Якщо замість PС вказати ZPС, то можна задати в команді значення програмного лічильника, дорівнюване 0.
Нижче наводяться приклади використовування команди JMP з різними способами адресування:
JMP ($400610, PС,A2.W)
JMP (*+$10, PС,A 2. W)
JMP ($4, PС, A 2. W)
JMP (*+$1000, PС, A 2. W)
JMP ($400610, ZPС, A 2. W)
Команди Асемблера М П68000 можуть займати від одного до 5 байт, а старших моделей – до 6 байт.
Контрольні питання:
1 Наведіть формат типової команди МП М 680 Х 0.
2 Зазначте, де у форматі типової команди є джерело, а де – приймач.
3 У який спосіб у форматі команди зазначається розрядність операндів?
4 У яких системах числення можна подавати операнди, адреси та зміщення у командах мови Асемблера МП фірми Motorola?
5 Які способи адресування операндів підтримує МП МС 68000?
6 Які способи адресування операндів підтримує додатково МП МС 68020 і старших моделей і з чим це пов’язано?
Контрольні питання підвищеної складності:
1 З якою метою, на Ваш погляд, використовується при роботі з масивами непряме регістрове адресування з постіндексуванням?
2 З якою метою, на Ваш погляд, використовується при роботі з масивами непряме регістрове адресування з преіндексуванням?
3 У яких випадках доцільно використовувати кожний із зазначених в пп. 1 та 2 видів адресування?
12.2 Система команд МП МС 680Х0 (Для самостійного вивчення)
Вхідний контроль:
1 Зазначте, де у команді мови Асемблер-86 SUB AX,BX є джерело, а де – приймач.
2 Зазначте, де у команді Асемблера МП М 680 Х 0 SUB D 0, D 1 є джерело, а де – приймач.
3 Яку розрядність має операнд у команді мови Асемблер-86 MOV AX,70H?
4 Яку розрядність має операнд у команді мови Асемблера МП М 680 Х 0 MOVЕ D 0, D 1?
5 Чи виставляють команди пересилань мови Асемблер-86 прапорець знаку?
6 Чи виставиться прапорець ZF при виконуванні команди MOV BX,0000 H?
Команди пересилань
Команда МOVЕ пересилає вміст джерела до приймача, наприклад:
МOVЕ.L #$12345678,$400700.L; Запис безпосереднього даного до
; комірки пам’яті з адресою $ 400700
MOVЕA A3,A4; Пересилання молодших 16-ти розрядів
; адресного регістра А3 у А4, старші
; 16 розрядів А4 розширюють знаком
MOVЕA.L D0,A0; Пересилання вмісту регістра D0 до A0
РЕA (A0); Запис вмісту регістра D0 до стека
MOVЕA.L #$800015,A0; Завантаження адреси додаткового
; регістра РААR порту А PI/T до А0
MOVЕР (0, A0),D0; Введення слова з додаткових регістрів
; РААR та PBAR за адресами $800015 та
; $800017 до D0
MOVЕР D0,(-4,A0); Зберігання слова з D0 у регістрах
; даних РАDR та PВDR, які мають
; відповідно адреси $800011 та $800013
Команда MOVEP забезпечує пересилання 16- або 32-розрядних операндів через 8-розрядні периферійні пристрої за два або чотири цикли обміну.
EXG D1,D3; Обмін вмістом регістрів D1 та D3
EXG A4,D2; Обмін вмістом регістрів А4 та D2
Слід відзначити, що команда пересилання MOVE виставляє прапорець N = 1 у разі негативного операнда, який пересилається, і скидає всі інші прапорці. Якщо пересилається операнд, який дорівнює 0, встановлюється прапорець Z = 1, а інші скидаються. Прапорець Х є індиферентний відносно значення операнда, який пересилається.