Побудова програм з різною структурою мовою Асемблер
МП фірми 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