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

3. Запис команд в masm

Зі сказаного ясно, що та сама операція залежно від типів операдов записується у вигляді різних машинних команд: наприклад, у ПК є 28 команд пересилання байтів і слів. У той же час в MASM всі ці "родинні" команди записуються одноманітно: наприклад, всі команди пересилання мають ту саму символьну форму запису:

MOV op1,op2 (op1:=op2)

Аналізуючи типи операндов, асемблер сам вибирає підходящу машинну команду.

У загальному випадку команди записуються в MASM у такий спосіб:

мітка: мнемокод операнди ; коментар

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

Мнемонічні назви операцій повністю перераховані в главі 2.

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

Регістри вказуються своїми іменами, наприклад:

MOV AX,SI ;обоє операнда - регістри

Безпосередні операнди задаються константними вираженнями (їх значеннями є константи-числа), наприклад:

MOV BH,5 ;5 - безпосередній операнд

MOV DI,SIZE X ;SIZE X (число байтів, займаних змінної X) - безпосередній операнд.

Адреси описуються адресними вираженнями (наприклад, іменами перемінних), які можуть бути модифіковані по одному або двом регістрам; наприклад, у наступних командах перші операнди задають адреси:

MOV X,AH

MOV X[BX][DI],5

MOV [BX],CL

При записі команд у символьній формі необхідно уважно слідкувати за правильною вказівкою типу (розміру) операндов, щоб не було помилок. Тип звичайно визначається по зовнішньому вигляді одного з них, наприклад:

MOV AH,5 ;пересилання байта, тому що AH - байтовий регістр

MOV AX,5 ;пересилання слова, тому що AX - 16-бітовий регістр

(операнд 5 може бути байтом і словом, по ньому не можна визначити розмір пересилаючої величини, що)

MOV [BX],300 ;пересилання слова, тому що число 300 не може бути байтом

Якщо по зовнішньому вигляді можна однозначно визначити тип обох операндів, тоді ці типи повинні збігатися, інакше асемблер зафіксує помилку. Приклади:

MOV DS,AX ;обоє операнда мають розмір слова

MOV CX,BH ;помилка: регістри CX й BH мають різні розміри

MOV DL,300 ;помилка: DL - байтовий регістр, а число 300 не

;може бути байтом

Можливі ситуації, коли по зовнішньому вигляді операндів не можна визначити тип жодного з них, як, наприклад, у команді

MOV [BX],5

Тут число 5 може бути й байтом, і словом, а адреса з регістра BX може вказувати й на байт пам'яті, і на слово. У подібних ситуаціях асемблер фіксує помилку. Щоб уникнути її, треба уточнити тип одного з операндов за допомогою оператора з назвою PTR:

MOV BYTE PTR [BX],5 ;пересилання байта

MOV WORD PTR [BX],5 ;пересилання слова

(Оператори - це різновид виражень мови MASM, аналогічні функціям.)

Оператор PTR необхідний й у тому випадку, коли треба змінити тип, запропонований імені при його описі. Якщо, наприклад, X описане як ім'я змінної розміром у слово:

X DW 999

і якщо треба записати в байтовий регістр AH значення тільки першого байта цього слова, тоді скористатися командою

MOV AH,X

не можна, тому що її операнди мають різний розмір. Цю команду треба записати трохи інакше:

MOV AH,BYTE PTR X

Тут конструкція BYTE PTR X означає адресу X, але вже розглянутий не як адреса слова, а як адреса байта. (Нагадаємо, що з одного й того же адреси може починатися байт, слово й подвійне слово; оператор PTR уточнює, осередок якого розміру ми маємо на увазі.)

І ще одне зауваження. Якщо в символьній команді, що оперує з словами, зазначений безпосередній операнд розміром у байт, як, наприклад, у команді

MOV AX,80h

та виникає деяка неоднозначність: що буде записано в регістр

AX - число 0080h (+128) або 0FF80h (-128)? У подібних ситуаціях асемблер формує машинну команду, де операнд - байт розширений до слова, причому розширення відбувається зі знаком, якщо операнд був записаний як негативне число, і без знака в інших випадках. Наприклад:

MOV AX,-128 ; => MOV AX,0FF80h (A:=-128)

MOV AX,128 ; => MOV AX,0080h (A:=+128)

MOV AX,80h ; => MOV AX,0080h (A:=+128)

Лекція 6

Тема: Сегментування

1. Сегменти пам’яті, сегментні регістри

2. Регістри по домовленості

3. Сегментування, базування та індексація адреси

4. Програмні сегменти. Директива ASSUME

5. Початкове завантаження сегментних регістрів

6. Посилання вперед