Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Опорний конспект лекцій_ Асемблер.Docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
506.89 Кб
Скачать
      1. Додаткові команди зсуву

Команди зсуву подвійної точності:

shld операнд_1, операнд_2, лічильник_зсувів – зсув вліво подвійної точності. Команда shld робить заміну шляхом зсуву бітів операнда операнд_1 вліво, заповнюючи його біти справа, бітами, що витісняються з операнда_2. Кількість зсовуваних бітів визначається визначається значенням лічильник_зсувів, яке лежить в діапазоні 0...31. Це значення може задаватися безпосередньо операндом або міститися в регістрі cl. Значення операнд_2 не змінюється.

shrd операнд_1, операнд_2, лічильник_зсувів – зсув вправо подвійної точності. Команда shrd робить заміну шляхом зсуву бітів операнда операнд_1 вправо, заповнюючи його біти зліва, бітами, що витісняються з операнда_2. Кількість зсовуваних бітів визначається визначається значенням лічильник_зсувів, яке лежить в діапазоні 0...31. Це значення може задаватися безпосередньо операндом або міститися в регістрі cl. Значення операнд_2 не змінюється.

Рис. 5.6. Схема роботи команд shld, shrd

    1. Команди передачі керування

Програма являє собою послідовність команд і даних, що займають певний простір оперативної пам’яті. То яка команда повинна виконуватися наступною, МП взнає по вмісту пари регістрів cs:(e)ip:

  • cs – сегментний регістр кода, в якому знаходиться фізичний (базовий) адрес поточного сегмента коду;

  • eip/ip – регістр вказівник команд, в якому знаходиться значення зміщення в пам’яті наступної команди, яка підлягає до виконання. Тип регістра залежить від режиму адресації use32 або use16.

Таким чином, команди передачі керування змінюють вміст регістрів cs і eip і в результаті виконується не наступна по порядку команда, а команда в іншому місці програми. Конвеєр всередині МП при цьому скидується.

Команди переходів можна розділити на три групи:

  1. Команди безумовної передачі керування:

    • Команди безумовного переходу;

    • виклик процедури і повернення із процедури;

    • виклик програмних переривань і повернення із програмних переривань.

  2. Команди умовної передачі керування:

    • команди переходу по результату команди порівняння;

    • команди переходу по стану певного прапора;

    • команди переходу по вмісту регістра exc/cx;

  3. Команди керування циклом:

    • команда організації цикла із лічильником ecx/cx;

    • команда організації цикла із лічильником ecx/cx з можливістю дострокового виходу із цикла по додатковій умові.

Щоб позначити місце куди необхідно передати керування, використовується мітка. Мітка

    • це символічне ім’я, що позначає певну комірку пам’яті, призначену для використання в якості операнда в командах передачі керування. Мітці асемблер присвоює три атрибути:

      • ім’я сегмента кода, де ця мітка описана;

      • зміщення – віддаль в байтах від початку сегмента, де описана мітка;

      • тип мітки, або атрибут віддалі (near – перехід на мітку можливий тільки в межах сегменту, far - перехід на мітку можливий в результаті між сегментної передачі керування).

Мітку можна описати двома способами:

      • оператором : ( символічне_ім’я : [ команда ассемблера ] );

      • директивою label ( символічне_ім’я label: [ команда ассемблера ] ).

З допомогою оператора : можна визначити тільки мітку типу near. Ця мітка може використовуватися в якості операнда в командах умовного jcc і безумовного jmp, call переходу, які повинні бути у тому ж сегменті що і мітка.

Директива label визначає мітки типу far. Мітка може бути тільки одного типу - near або

far. Для того, щоб зробити видимим ім’я мітки ззовні, застосовується директива public: public m _far ; зробити мітку видимою для зовнішніх програм

m_far label far ; визначення мітки дального типу

m_near: ; визначення мітки ближнього типу

Другий випадок застосування директиви label – це організація доступу до однієї області пам’яті, як до області, що містить дані різних типів:

mas_b label byte mas_w dw 15 dup (?)

...

mov mas_b+10, al ; записати в 11 байт із al

mov mas_w, ax ; записати в перше слово області mas_w із ах

До міток має також пряме відношення – лічильник адреса команд (зміщення поточної команди відносно початку сегмента). Для роботи із цим лічильником є дві можливості:

o використання міток, атрибуту зміщення яких транслятор присвоює значення лічильника адреса тієї команди, перед якою вони появились;

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

.data

Str_Mes db “Testova stroka”

Len_mes=$-Str_Mes ; Len_mes дорівнює довжині строчки Str_Mes.

Для встановлення значення лічильника адреса в абсолютне значення використовується директива ORG вираз. Наприклад: org 100h. Цю директиву завжди використовують при створенні виконуваного файлу з типом .com для резервування префікса програмного сегменту величною 256 байт (100h).