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

Системне програмування, доц. І.І. Мітасов, 2010р. Лекція 8, 8 сторінок

Тема 2. Архітектура процесора і мова асемблера: Основи програмування на мові асемблера

ЛЕКЦІЯ 8. Система команд процесора

Питання лекції: – Команди пересилки даних загального призначення

  • команди вводу-виводу в порт

  • робота з адресами і покажчиками

  • команди перетворення даних

  • огляд групи арифметичних команд і даних

  • цілі двійкові числа

  • десяткові числа

1. Команди пересилки даних

Для зручності практичного застосування та відображення їх специфіки команди даної групи зручніше розглядати у відповідності з їх функціональним призначенням, згідно з яким їх можна розбити на наступні групи команд: пересилання даних загального призначення; вводу-виводу в порт; роботи з адресами та покажчиками; перетворення даних і роботи зі стеком.

1.1. Команды пересилки даних загального призначення

До цієї групи відносяться такі команди: mov <операнд призначення>,<операнд-джерело> і xchg <операнд1>,<операнд2>

masm

model small

.data

fls db 5

fld db ?

.code

start:

...

mov al,fls

mov fld,al

...

end start

mov - це основна команда пересилки даних. Вона реалізує найрізноманітніші варіанти пересилки.
Відзначимо особливості застосування цієї команди:

• командою mov не можна здійснити пересилання з однієї області пам'яті в іншу. Якщо така необхідність виникає, то потрібно використовувати як проміжний буфер будь-який доступний в даний момент регістр загального призначення.

Приміром, розглянемо фрагмент програми для пересилання байту з комірки fls в комірку fld:

• не можна завантажити в сегментний регістр значення безпосередньо з пам'яті. Тому для виконання такого завантаження потрібно використовувати проміжний об'єкт. Це може бути регістр загального призначення або стек. Раніше ми вже використовували на початку сегмента коду дві команди mov, що виконують налаштування сегментного регістра ds. При цьому через неможливість завантажити прямо в сегментний регістр значення адреси сегмента, що міститься в зумовленій змінній @data, доводиться використовувати регістр загального призначення ax;

• не можна переслати вміст одного сегментного регістра в інший сегментний регістр. Це пояснюється тим, що в системі команд немає відповідного коду операції. Але необхідність у такій дії часто виникає. Виконати таку пересилку можна, використовуючи в якості проміжних все ті ж регістри загального призначення. Ось приклад ініціалізації регістра es значенням з регістра ds:

mov ax,ds

mov es,ax

Але є й інший спосіб виконання даної операції - використання стека і команд push та pop:

push ds ;помістити значення регістра ds в стек

pop es ;записати в es число зі стека

• не можна використовувати сегментний регістр cs як операнд призначення. Причина тут проста. Справа в тому, що в архітектурі мікропроцесора пара cs:ip завжди містить адресу команди, яка повинна виконуватися наступною. Зміна командою mov вмісту регістра cs фактично означала б операцію переходу, а не пересилки, що неприпустимо.

Для двобічної пересилки даних застосовують команду xchg. Для цієї операції можна, звичайно, застосувати послідовність з декількох команд mov, але через те, що операція обміну використовується досить часто, розробники системи команд мікропроцесора вважали за потрібне ввести окрему команду обміну xchg. Природно, що операнди повинні мати один тип. Не допускається (як і для всіх команд асемблера) обмінювати між собою вміст двох комірок пам'яті. Приміром,

xchg ax,bx ;обміняти вміст регистрів ax і bx

xchg ax,word ptr [si] ;обміняти вміст регістра ax і слова в пам’яті за адресою в [si]

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