Непряме регістрове адресування з постіндексуванням

 

Синтаксис Асемблера має вигляд

 

([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 розряди.

Наприклад, запис A3.W*2 означає, що за індекс у команді слугує вміст 16-ти молодших розрядів регістра адреси А3, зсунутий на один розряд ліворуч та розширений знаком до 32-х розрядів.

Команда

 

CLR ([$1234,A2],D3.L,$5678)

 

очищуватиме комірку пам’яті з ефективною адресою ЕА, яка підраховується в такий спосіб. Припустимо, що вміст регістра А2 становить $400600, а регістра D3 – відповідно $1000. Частина ефективної адреси ЕА, подана у квадратних дужках, має вигляд

 

+
$400600

$001234

$401834

 

Припустимо, що за цією адресою у пам’яті зберігається число $600600. Тоді повна ефективна адреса, зазначена у команді, матиме вигляд

 

ЕА = $600600 + $1000 + $5678 = $606C78.

 

Внаслідок виконання команди буде обнулено 16 молодших розрядів даного, яке зберігається у пам’яті, розпочинаючи з адреси $606C78.

 

Непряме регістрове адресування з преіндексуванням

 

Синтаксис Асемблера має вигляд

 

([bd,An,Ri.s*SCALE],od)

 

Ефективна адреса ЕА підраховується аналогічно до попереднього способу.

Команда

 

CLR ([$1234,A2,D3.L]$5678)

 

очищуватиме комірку пам’яті з ефективною адресою ЕА, частина якої, подана у квадратних дужках, матиме вигляд

 

$400600 + $1234 + $1000 = $402834.

 

Припустимо, що, розпочинаючи з цієї адреси, у пам’яті зберігається довге слово $600600, тоді

 

ЕА = $600600 + $5678 = $605С78.

 

Внаслідок виконання команди буде обнулено 16 молодших розрядів даного, яке зберігається у пам’яті, розпочинаючи з адреси $605С78.

 

Непряме відносне адресування з індексуванням

 

Синтаксис Асемблера має вигляд

 

(*+d,PС,Ri.s*SCALE)

або

(ххх,PС,Ri.s*SCALE).

 

За вміст вважається адреса наступної команди.

За непрямого відносного адресування з постіндексуванням та преіндексуванням ефективна адреса формується як за непрямого регістрового адресування, але замість вмісту регістра Аn використовується вміст програмного лічильника :

 

ЕА = [PС + bd] + (Xn) * SCALE + od – у разі постіндексування

EA = [PС + (Xn) * SCALE + bd] + od – у разі преіндексування

 

Якщо замість вказати ZPС, то можна задати в команді значення програмного лічильника, дорівнюване 0.

Нижче наводяться приклади використовування команди JMP з різними способами адресування:

JMP ($400610,PС,A2.W)

JMP (*+$10,PС,A2.W)

JMP ($4,,A2.W)

JMP (*+$1000,,A2.W)

JMP ($400610,ZPС,A2.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 D0,D1 є джерело, а де – приймач.

3 Яку розрядність має операнд у команді мови Асемблер-86 MOV AX,70H?

4 Яку розрядність має операнд у команді мови Асемблера МП М680Х0 MOVЕ D0,D1?

5 Чи виставляють команди пересилань мови Асемблер-86 прапорець знаку?

6 Чи виставиться прапорець ZF при виконуванні команди MOV BX,0000H?

 

Команди пересилань

 

Команда М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, а інші скидаються. Прапорець Х є індиферентний відносно значення операнда, який пересилається.