Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Антонов О.С., Хiхловська I.В. Обчислювальна тех...doc
Скачиваний:
15
Добавлен:
01.09.2019
Размер:
4.12 Mб
Скачать

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

12.3.1 Лінійні програми

Вхідний контроль:

  1. Як будуть розміщатись у пам’яті байти команди мови Асемблер-86 MOV AX, 7000H, якщо команда розташована, починаючи з адреси 7000:0100?

  2. Команда з якою адресою буде виконуватись наступною у лінійній програмі?

  3. Яка адреса вміщується у вказівнику команд ІР МП фірми Intel на лінійних ділянках програми?

У якості приклада побудови лінійної програми розглянемо ділення 64-розрядного числа $ABCDEF1234567893 зі знаком на 32-розрядне число $20000002.

MOVЕ.L #$34567894, D1

MOVЕ.L $275CB756, D2

MOVЕ.L $EE C9B416, D3

DIVS.L D1, D3: D2

NOP

Результатом виконання фрагмента буде частка від ділення (розряди 0...31), яка дорівнює $ABCDEF14, вона буде розміщена у D2, і стача $EB851FC6 (розряди 0...31), яка буде розміщена у регістрі D3.

Зробимо перевірку вірності отриманого результату за допомогою фрагмента програми

EOR.L D4, D4

MULS.L D1, D4: D2

ADD.L D3, D2

Результатом виконання фрагмента буде наявність у регістровій парі D4:D2 числа #$EEC9В46275CB756, вміст регістра D1 не зміниться.

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

  1. Яку частку програм, на Ваш погляд, займають лінійні ділянки?

  2. Як будуть розміщатись у пам’яті байти команди мови асемблер МП М680Х0 MOVE #$1234? D0, якщо команда розташована, починаючи з адреси $400600?

  3. Команда з якою адресою буде виконуватись наступною у лінійній програмі?

  4. Яка адреса вміщується у лічильнику команд РС МП фірми Motorola на лінійних ділянках програми?

12.3.2 Розгалужені та циклічні програми. Підпрограми

Вхідний контроль:

  1. Наведіть приклад застосування арифметичного циклу.

  2. Наведіть приклад застосування ітераційного циклу.

  3. За яким принципом реалізуються підпрограми часової затримки?

Приклад 12.3.1 Написати фрагмент програми, який би здійснював часову затримку на термін, який визначається найбільшим числом, яке можна трактувати як байт.

400600 MOVЕ.В #$FF, D6 ; Затримка здійснюється за рахунок

400602 SUB #1, D6 ; повторення у циклі команди віднімання 1 з

400604 BNE * -2 ; лічильника D6; цикли повторюються, доки

400608 NOP ; його вміст не дорівнює нулю

Фрагмент програми, який реалізує затримку, може бути оформлений у вигляді підпрограми.

Приклад 12.3.2 Написати фрагмент програми, який виводить слово $1234 у додатковий регістр РААR РІ/Т, а через час, який визначається вмістом D2 у підпрограмі ТІМЕ, слово $5678 у той самий регістр РААR РІ/Т.

МOVЕ,B #$1234, D0 ; Завантаження даного $1234 у регістр D0

MOVЕ,L #$800015, A0 ; Завантаження адреси регістра

; PAAR PI/T у А0

MOVЕP.B D0, (A0) ; Запис даного $1234 у регістр PAAR

JSR ТІМЕ ; Звернення до підпрограми TIME

MOVЕ.B #$5678, D1 ; Завантаження даного $5678 у регістрі D1

MOVЕP.B D0, (A0) ; Запис даного у регістр PAAR РІ/Т

ТІМЕ: MOVЕ #$AB, D2 ; Підпрограма

М2 : SUB #1, D2 ; ТIME

BNE M2 ;

RTS ;

Приклад 12.3.3 Написати підпрограму визначення парності або непарності кількості одиниць у байті, який міститься в регістрі.

Задача розв’язується шляхом логічного зсуву байта у циклі, наприклад, праворуч, та підрахування кількості разів, коли встановлювався прапорець перенесення С. Структурну схему алгоритму підрахування кількості одиниць зображено на рис. 12.8.

Програма розв’язання задачі на асемблері МП МС68020:

EVEN: MOVE SR, D5 ; Завантаження регістра стану у D5

CLR.L D2 ; Обнулення D2, лічильника суми

MOVE.L #$7, D3 ; Організація лічильника циклів у D3

MOVE.L #$09, D0 ; Завантаження байта $9 у регістр D0

M1: LSR.B #$1, D0 ; Зсув праворуч регістра D0 на один розряд

BCS.B M2 ; Перехід до лічильника суми

BRA.B M3 ; Обхід підсумовування

M2: ADDI #$1, D2 ; Додавання 1, якщо С = 1

M3: DBF D3, M1 ; Організація повторення циклів

BTST #$0, D2 ; Перевірка парності кількості

; одиниць суми у D2

BNE.B M4 ; Число непарне?

CLR.L D2 ; Ні, обнулення D2

BRA.B M5 ; Обхід запису числа FDH у D2

M4: MOVE.L #$FD, D2 ; Так, запис до D2 числа $FD

M5: MOVE D5, SR ; Відновлення регістра стану з D5

RTS ; Повернення з підпрограми

Якщо кількість одиниць є непарна, то у регістр D2 записується довільна позначка $FD, а якщо ж парна, то регістр D2 обнулюється.

Приклад 12.3.4 Порівняти значення байтів у масивах (А0) і (А1), які складаються з чисел зі знаками у межах шести пар. За умовою DBGT організувати вихід з циклу, показати, скільки циклів буде виконано.

(A0) (A1)

400600 MOVЕA.L #$ 400700, A0 5F 40

400606 MOVЕA.L #$400800, A1 3F F4 (-12)

40060C MOVЕ #$5, D0 (-1)FF F0 (-16)

400610 CMPM.B (A0)+, (A1)+ 2F F0 (-16)

400612 DBGT D0, $400610 (-32)E0 A3 (-93)

400616 NOP (-16)F0 AF (-81)

Рисунок 12.8 — Структурна схема алгоритму підрахування кількості одиниць

Оскільки елементи масивів трактуються як числа зі знаками, то від’ємні числа подані у доповняльному коді, (поруч ці ж числа подані зі знаком у десятковий системі числення). Враховуючи особливості виконання команди СМРМ (А0)+, (А1)+ (від елемента, який адресується А1 віднімається елемент, адресований А0), можна свідчити, що вихід з циклу відбудеться за наявністю у лічильнику циклів числа -1, за вказаною умовою DBGT цикл не завершується у межах порівняння шести пар елементів. Кількість циклів складає 6.

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

  1. Визначити час затримки, який реалізується фрагментом програми у прикладі 12.3.1.

  2. Визначити час затримки, який реалізує підпрограма TIME у прикладі 12.3.2.

  3. Написати підпрограму часової затримки на 2 мкс для реалізації на МП МС68000 і на МП МС68020.