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

МП фірми Motorola

 

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

 

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

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

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

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

 

За приклад побудови лінійної програми розглянемо ділення 16-розрядного числа $5679 зі знаком на 16-розрядне число $0004.

 

MOVЕ.L #$00005679,D2

MOVЕ.L #$00000004,D1

DIVS D1,D2

NOP

 

Результатом виконання фрагмента буде частка від ділення (розряди 0...15), яка дорівнює $159E, вона буде розміщена у D2 (розряди 0...15), і стача $0001 (розряди 16...31), яку буде розміщено також у регістрі D2.

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

 

EOR.L D3,D3

MOVE.L D2,D3

MULS D1,D2

SWAP D3

ADD D3,D2

 

Результатом виконання фрагмента буде наявність у регістрі D2 числа $5679, вміст регістра D1 не зміниться.

 

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

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

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

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

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

 

Контрольні питання підвищеної складності:

1 Віднайти добуток даних $1234 та $2 усіма відомими Вам способами: написати фрагменти програми, які їх зреалізовують.

2 Віднайти частку від ділення здобутого у попередньому завданні результату на $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.10.

Програма розв’язання задачі на Асемблері МП МС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