Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lab_1-3.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
997.89 Кб
Скачать

1.6. Команди циклічного зсуву бітів числа

Циклічний зсув, на відміну від логічного та арифметичного, передбачає перенесення біта, що зсувається, до розряду, який при цьому звільнюється. В мові асемблер існує чотири команди циклічного зсуву:

ROR - циклічний зсув праворуч;

ROL - циклічний зсув ліворуч;

RCR - циклічний зсув праворуч з урахуванням перенесення;

RCL - циклічний зсув праворуч без урахування перенесення.

Роботу команд циклічного зсуву на одну позицію відображено на рис. 5. Відмінність команд циклічного зсуву ROR та ROL від команд логічного зсуву полягає у тому, що біт, який зсувається, переходить на позицію що звільнюється. У командах RCR та RCL у зсуві приймає участь прапор перенесення CF. При цьому біт, який зсувається, переходить до прапора CF, а значення прапора CF переходить до комірки, що звільнюється. Як і в командах логічного зсуву, зсув на одну позицію може бути вказаний безпосередньо, а для зсуву на дві позиції або більше треба вказати кількість позицій у регістрі CL.

Завдання для перевірки №11:Напишіть фрагмент асемблерної програми з використанням команд циклічного зсуву та проаналізуйте результат їх виконання так само, як це було зроблено у наведеному прикладі для команд SAR та SHR.

Завдання для перевірки №12: Напишіть фрагмент асемблерної програми для множення на два даних подвійної довжини, старші байти яких розташовані у регістрі DX, а молодші - у регістрі AX.

Прапор перенесення

Прапор перенесення

Команда ROL

Команда RCR

1

0

Команда RCL

1

1

Рис. 5 Ілюстрація виконання команд циклічного зсуву.

1.7. Структура асемблерних програм для com- та exe-модулів. Виклик процедур та стек

Зрозуміло, що процесор «не розуміє» асемблерних команд. Їх треба перевести у чисельні двійкові комп’ютерні коди. Програма на мові асемблера називається початковою, а програма у комп’ютерних кодах об’єктною. Переведення початкового коду до об’єктного здійснює програма TASM. Можна виконати і зворотню операцію - перевести об’єктний код до початкового, проаналізувати і навіть змінити його за допомогою відладчиків TASM та AFD. Саме ці операції були предметом вивчення у першій лабораторній роботі.

Як вже було відмічено, загалом будь-яка програма містить три пов’язані між собою блоки: сегмент коду, сегмент стеку та сегмент даних. При програмуванні на асемблері до сегмента коду входять коди команд обробки даних, а до сегмента даних - директиви їх визначення. Стек - це окрема область пам’яті, яка відрізняється особливістю організації доступу. Якщо до стека завантажено декілька чисел, то зчитати можна лише число, яке було завантажене останнім. Тобто, якщо до стека послідовно завантажено чотири числа, для того, щоб зчитати друге, потрібно з початку зчитати четверте та третє. Кількість завантажених байтів для процесору Intel 8086 та сумісних з ним визначається через вказівник стеку SP, а адреса сегменту стека - значенням регістру SS. У літературі стекова організація пам’яті отримала також назву «останній зайшов - перший вийшов» [1].

Зрозуміло, що така організація пам’яті не є зручною для завантаження даних користувача, які можуть стати потрібними у будь-який момент у будь-якому порядку. Але саме вона допомагає організувати ефективну обробку зовнішніх функцій та процедур. Виконання команди виклику процедури CALL процесор здійснює таким чином:

  • адреса, що міститься в командному вказівнику, завантажується до стеку. При цьому вказівник стеку збільшується на 2;

  • вміст всіх регістри процесора також завантажується до стеку, проводиться відповідна зміна вказівника стека;

  • здійснюється передача керування за адресою початку процедури.

Кожна процедура завершується командою RET, яка зменшує вказівник стеку на відповідну величину і завантажує числа, які в ньому містилися, до командного вказівника та регістрів процесора. Така організація обробки процедур є дуже ефективною і дозволяє уникнути помилок при зміні та відновленні адрес та зберегти всі дані користувача при ефективній організації обчислень.

Але у деяких випадках стек може бути використаний і безпосередньо для зберігання даних. Для цього призначені такі головні асемблерні команди:

PUSH - завантажити до стеку одне слово. Команда має лише один операнд, яким можуть виступати регістр загального призначення, комірки пам’яті, сегментні регістри. Вказівник стеку після виконання команди збільшується на 2.

POP – вивантажити слова із стека. Команда також має один операнд, який завжди є ідентичним до операнду попередньої команди PUSH. Вказівник стеку після виконання команди зменшується на 2.

PUSHA - команда заносить до стеку одночасно вісім значень, що містяться відповідно в регістрах AX, BX, CX, DX, SP, BP, SI, DI. Вказівник стеку збільшується на 16. Після цієї команди одночасне відновлення всіх значень регістрів може бути здійснено через команду POPA.

PUSHF - заносить до стеку слово стану процесора. Для відновлення регістру стану достатньо виконати команду POPF.

Формат команд PUSH та POP:

{позначка} [код команди] [операнд]

Команди PUSHA, POPA, PUSHF та POPF не містять операндів.

Як вам відомо з курсу “Персональні комп’ютери та мови програмування”, існує 2 типи об’єктних файлів - модулі типу exe та модулі типу com. Написання мовою асемблера модулів цих типів має свої особливості.

Особливості написання модуля типу com:

  • Обсяг com-програми не повинен перевищувати розміру одного сегмента (64К). Тому дані користувача об’єднуються з кодами команд, а стек, якщо в цьому є необхідність, генерується автоматично.

  • Будь-яка програма, що працює під керуванням MS-DOS, починається з префіксу програмного сегменту (PSP), який займає 256 перших байт будь-якого сегменту. PSP створюється автоматично при завантаженні програми системою (дивиться рис. 2). Але в com-програмі PSP не виконується, тому першим оператором будь-якої com-програми мусить бути директива ORG 100H (перехід на початок програми користувача).

  • Оскільки директиви визначення даних містяться у тому ж сегменті, що і команди програми, але не виконуються комп’ютером при її обробці, для коректного виконання програми треба обходити місце визначення даних за допомогою команди безумовного переходу JMP. Більш досконало про команду безумовного переходу у мові програмування асемблер ви дізнаєтесь з теоретичних відомостей до лабораторної роботи №3.

  • Будь-яка com-програма закінчується командою RET, яка повертає керування до операційної системи MS-DOS.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]