МП фірми Motorola
Лінійні програми
Вхідний контроль:
1 В який спосіб будуть розміщуватись у пам’яті байти команди мовою Асемблер-86 MOV AX,7000 H, якщо команду розташовано розпочинаючи з адреси 7000:0100?
2 Команда з якою адресою виконуватиметься наступною у лінійній програмі?
3 Яка адреса вміщується у вказівнику команд ІР МП фірми Intel на лінійних ділянках програми?
За приклад побудови лінійної програми розглянемо ділення 16-розрядного числа $5679 зі знаком на 16-розрядне число $0004.
MOVЕ.L #$00005679,D2
MOVЕ.L #$00000004,D1
DIVS D1,D2
NOP
Результатом виконання фрагмента буде частка від ділення (розряди 0...15), яка дорівнює $159 E, вона буде розміщена у D 2 (розряди 0...15), і стача $0001 (розряди 16...31), яку буде розміщено також у регістрі D 2.
Зробимо перевірку правильності здобутого результату за допомогою фрагмента програми
EOR.L D3,D3
MOVE.L D2,D3
MULS D1,D2
SWAP D3
ADD D3,D2
Результатом виконання фрагмента буде наявність у регістрі D 2 числа $5679, вміст регістра D 1 не зміниться.
Контрольні питання:
1 Яку частку програм, на Ваш погляд, займають лінійні ділянки?
2 В який спосіб будуть розміщуватись у пам’яті байти команди мовою Асемблер МП М 680 Х 0 MOVE #$1234, D 0, якщо команда розташована розпочинаючи з адреси $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 РІ/Т, а через час, визначуваний вмістом D 2 у підпрограмі ТІМЕ, слово $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