ПЕРЕЛІК ДИСЦИПЛІН:
  • Адміністративне право
  • Арбітражний процес
  • Архітектура
  • Астрологія
  • Астрономія
  • Банківська справа
  • Безпека життєдіяльності
  • Біографії
  • Біологія
  • Біологія і хімія
  • Ботаніка та сільське гос-во
  • Бухгалтерський облік і аудит
  • Валютні відносини
  • Ветеринарія
  • Військова кафедра
  • Географія
  • Геодезія
  • Геологія
  • Етика
  • Держава і право
  • Цивільне право і процес
  • Діловодство
  • Гроші та кредит
  • Природничі науки
  • Журналістика
  • Екологія
  • Видавнича справа та поліграфія
  • Інвестиції
  • Іноземна мова
  • Інформатика
  • Інформатика, програмування
  • Юрист по наследству
  • Історичні особистості
  • Історія
  • Історія техніки
  • Кибернетика
  • Комунікації і зв'язок
  • Комп'ютерні науки
  • Косметологія
  • Короткий зміст творів
  • Криміналістика
  • Кримінологія
  • Криптология
  • Кулінарія
  • Культура і мистецтво
  • Культурологія
  • Російська література
  • Література і російська мова
  • Логіка
  • Логістика
  • Маркетинг
  • Математика
  • Медицина, здоров'я
  • Медичні науки
  • Міжнародне публічне право
  • Міжнародне приватне право
  • Міжнародні відносини
  • Менеджмент
  • Металургія
  • Москвоведение
  • Мовознавство
  • Музика
  • Муніципальне право
  • Податки, оподаткування
  •  
    Бесплатные рефераты
     

     

     

     

     

     

         
     
    Мова макроассемблера IBM PC
         

     

    Інформатика, програмування
    МОВА МАКРОАССЕМБЛЕРА IBM PC (Довідковий посібник) Укладач: В. Н. Пильщиків (МДУ,
    ВМК) (січень 1992 р.) У посібнику розглядається мова макроассеблера для персональних
    ЕВМтіпа IBM PC (мова MASM, версія 4.0). Посібник складається з 4 розділів. У главі
    1 розглянуто особливості персональні комп'ютерів типу IBM PC і приведені
    початкові відомості оязике MASM. У главі 2 описується система команд цих компьютеров.Глава
    3 присвячена присвячена власне мови MASM. У главі 4 пріведенипрімери
    фрагментів програм та повних програм на MASM для вирішення раз-особистих завдань.
    У посібнику не розглядаються питання, пов'язані з обробкою дво-ічно-десяткових
    чисел і роботою арифметичного співпроцесора 8087 ілі80287. Під терміном
    "ПК" в посібнику розуміється персональний комп'ютер тіпаIBM PC c мікропроцесором
    8088/8086, 80186 або 80286. Розділ 1. ОСОБЛИВОСТІ ПК. ВСТУП У MASM. 1.1. ОПЕРАТИВНА
    ПАМ'ЯТЬ. РЕГІСТРИ. 1.1.1 Оперативна пам'ять Об'єм оперативної пам'яті ПК
    - 2 ^ 20 байт (1 Мб). Байти нумеруютсяначіная з 0, номер байта називається його адресою.
    Для посилань на байтипамяті використовуються 20-розрядні адреси: від 00000 до
    FFFFF (в 16-річ-ний системі). Байт містить 8 розрядів (бітів), кожен з яких
    може прини-мати значення 1 або 0. Розряди нумеруються справа наліво від 0 до
    7: ----------------- | | | | | | | | | ----------------- 7 6 5 4 3 2 1 0 Байт
    - Це найменша адресуемая комірка пам'яті. У ПК іспользуютсяі більші комірки
    - Слова і подвійні слова. Слово - це два сусід-них байтів, розмір слова - 16
    бітів (вони нумеруються справа наліво від 0до 15). Адресою слова вважається адреса
    його перший байт (з меншим ад-ресом); ця адреса може бути парним і непарним.
    Подвійне слово - етолюбие чотири сусідніх байти (два сусідніх слова), розмір такої
    осередку-32 біта; адресою подвійного слова вважається адреса її першого байта.
    Байти використовуються для зберігання невеликих цілих чисел і символів, слова - для зберігання
    цілих чисел і адрес, подвійні слова - для зберігати-ня "довгих" цілих чисел
    і т. зв адресних пар (сегмент: зсув). 1.1.2 Регістри Крім осередків оперативної
    пам'яті для зберігання даних (правда, крат-ковременного) можна використовувати
    і регістри - комірки, що входять в сос-тав процесора і доступні з машинної програми.
    Доступ до регістрамосуществляется значно швидше, ніж до комірок пам'яті,
    тому ис-користування регістрів помітно зменшує час виконання програм.
    Всі регістри мають розмір слова (16 бітів), за кожним з них зак-реплено певний
    ім'я (AX, SP і т.п.). За призначенням і способуіспользованія регістри можна
    розбити на наступні групи: - регістри загального призначення (AX, BX, CX, DX,
    BP, SI, DI, SP); - сегментні регістри (CS, DS, SS, ES); - лічильник команд (IP);
    - Регістр прапорів (Flags). (Розшифровка цих назв: A - accumulator, акумулятор;
    B - base, база; C - counter, лічильник; D - data, дані; BP - base pointer,
    ука-затель бази; SI - source index, індекс джерела; DI - destinationindex, індекс
    приймача; SP - stack pointer, покажчик стека; CS-code segment, сегмент
    команд; DS - data segment, сегмент даних; SS-stack segment, сегмент стека; ES
    - Extra segment, додатковий сег-мент; IP - instruction pointer, лічильник команд.)
    Регістри загального призначення можна використовувати в усіх аріфметічес-ких і
    логічних командах. У той же час кожен з них має визна-ленну спеціалізацію
    (деякі команди "працюють" тільки з певними регістрами). Наприклад,
    команди множення і ділення вимагають, чтобиодін з операндів знаходився в регістрі
    AX або в регістрах AX і DX (в залежності від розміру операнда), а команди управління
    циклом викорис-зуются регістр CX в якості лічильника циклу. Регістри BX і
    BP дуже час-то використовуються як базові регістри, а SI і DI - як індексні.
    Ре-гістр SP зазвичай вказує на вершину стека, апаратно поддержіваемогов ПК.
    Регістри AX, BX, CX і DX конструктивно влаштовані так, що возможеннезавісімий доступ
    до їх старшої та молодшої половин; можна сказати, що кожен з цих регістрів
    складається з двох байтових регістрів, обо-значущих AH, AL, BH і т.д. (H - high,
    старший; L - low, молодший): ----------- ----------- ----------- -------- --- AX
    | AH | AL | BX | BH | BL | CX | CH | CL | DX | DH | DL | ----------- -----------
    ----------- ----------- 15 8 7 0Такім чином, з кожним із цих регістрів можна
    працювати як з едінимцелим, а можна працювати і з його "половинками". Наприклад,
    можна запи-описати слово в AX, а потім вважати тільки частину слова з регістру
    AH ілізаменіть тільки частину в регістрі AL і т.д. Такий пристрій регістровпозволяет
    використовувати їх для роботи і з числами, і з символами. Всі інші регістри
    не діляться на "половинки", тому вважатися записати їх вміст (16 бітів)
    можна тільки цілком. Сегментні регістри CS, DS, SS і ES не можуть бути операндами
    ника-ких команд, крім команд пересилання і стекові команд. Ці регістри
    ис-користуються тільки для сегментації адрес (див. 1.4). Лічильник команд
    IP завжди містить адреса (зміщення від початку про-грами) тієї команди, яка повинна
    бути виконана наступної (началопрограмми зберігається в регістрі CS). Вміст
    регістру IP можна вимірюв-нить тільки командами переходу. 1.1.3 Прапори І, нарешті,
    в ПК є особливий регістр прапорів. Прапор - це біт, що приймає значення 1 ( "прапор
    встановлений "), якщо виконано некотороеусловіе, і значення 0 (" прапор скинутий ")
    в іншому випадку. У ПК ис-користується 9 прапорів, кожному з них присвоєно певну
    ім'я (ZF, CFі т.д.). Всі вони зібрані в регістрі прапорів (кожен прапор
    - Це одна ізразрядов регістру, частина його розрядів не використовується): ------------------------------------- ------------
    Flags | x | x | x | x | OF | DF | IF | TF | SF | ZF | x | AF |
    x | PF | x | CF | ------------------------------------------ ------- 15 14 13 12
    11 10 9 8 7 6 5 4 3 2 1 0 Деякі прапори прийнято називати прапорами умов; вони
    автоматичні-ки змінюються при виконанні команд і фіксують ті чи інші властивості
    іхрезультата (наприклад, чи він дорівнює нулю). Інші прапори називаються ФЛА-гами станів;
    вони змінюються з програми і впливають на по-дальшої поведінка
    процесора (наприклад, блокують переривання). Прапори умов: CF (carry flag) -
    прапор переносу. Приймає значення 1, якщо прісложеніі цілих чисел з'явилася одиниця
    переносу, не "влазити" в раз-рядну сітку, або якщо при віднімання чисел
    без знака перший з них б-ло менше другий. У командах зрушення в CF заноситься
    біт, що вийшов заразрядную сітку. CF фіксує також особливості команди множення.
    OF (overflow flag) - прапорець переповнення. Встановлюється в 1, есліпрі складання
    або віднімання цілих чисел зі знаком вийшов результат, по модулю перевершує
    допустиму величину (сталося переполненіемантісси і вона "залізла" в знаковий
    розряд). ZF (zero flag) - прапор нуля. Встановлюється в 1, якщо результаткоманди
    виявився рівним 0. SF (sign flag) - прапор знаку. Встановлюється в 1, якщо
    в операціінад знаковими числами вийшов негативний результат. PF (parity flag)
    - Прапор парності. Дорівнює 1, якщо результат чергу-ної команди містить парне
    кількість двійкових одиниць. Учітиваетсяобично тільки при операціях вводу-виводу.
    AF (auxiliary carry flag) - прапорець додаткового переносу. Фікс-рілої особливості
    виконання операцій над двійковій-десятковими числами. Прапори станів: DF
    (direction flag) - прапорець напрямку. Встановлює направленіепросмотра рядків
    у строкових командах: при DF = 0 рядки проглядаються "вперед" (від початку до кінця),
    при DF = 1 - у зворотному напрямку. IF (interrupt flag) - прапорець переривань. При
    IF = 0 процесор переста-і реагувати на що надходять до нього переривання, при
    IF = 1 блокіровкапрериваній знімається. TF (trap flag) - прапорець трасування. При TF = 1
    після виконання каж-дой команди процесор робить переривання (з номером 1),
    чим можна вос-користуватися при налагодженні програми для її трасування. 1.2. ПОДАННЯ
    ДАНИХ. Арифметичні операції Тут розглядається машинне подання
    цілих чисел, рядків іадресов. Представлення двійковій-десяткових чисел, що використовуються
    достатньо точно рідко, не розглядається. Що стосується дійсних чисел,
    то ВПК немає команд речової арифметики (операції над цими числами реа-лізуются
    програмним шляхом або виконуються співпроцесором) і тому нетстандартного
    подання дійсних чисел. Крім того, розглядає-вають деякі особливості
    виконання арифметичних операцій. Шістнадцяткові числа записуються
    з буквою h на кінці, двоічниечісла - з буквою b (так прийнято в MASM). 1.2.1 Представлення
    цілих чисел. У загальному випадку під ціле число можна відвести будь-яке число
    байтів, проте система команд ПК підтримує тільки числа розміром в байт іслово
    і частково підтримує числа розміром в подвійне слово. Іменноеті формати
    і будуть розглянуті. У ПК робиться відмінність між цілими числами без знаку (неотріца-них)
    і зі знаком. Це пояснюється тим, що в осередках одного й те-го
    ж розміру можна уявити більший діапазон беззнакових чисел, ніж невід'ємних
    знакових чисел, і якщо відомо заздалегідь, що неко-торая числова величина
    є невід'ємне, то вигідніше розглядають Ріва її як беззнакові, ніж як
    знакову. Цілі числа без знака. Ці числа можуть бути представлені у вигляді байтів,
    слова або двойногослова - залежно від їх розміру. У вигляді байти представляються
    целиеот 0 до 255 (= 2 ^ 8-1), у вигляді слова - цілі від 0 до 65535 (= 2 ^ 16-1),
    у вигляді подвійного слова - цілі від 0 до 4 294 967 295 (= 2 ^ 32-1). Числа за-пісиваются
    в двійковій системі числення, займаючи всі розряди ячейкі.Напрімер, число 130
    записується у вигляді байтів 10000010b (82h). Числа розміром в слово зберігаються в
    пам'яті в "перевернутому" вигляді: молодшого (праві) 8 бітів числа розміщуються в першу
    байті слова, астаршіе 8 бітів - у другому байті (у 16-річної системі: два правиеціфри
    - В першому байті, дві ліві цифри - у другому байті). Наприклад, число
    130 (= 0082h) у вигляді слова зберігається в пам'яті так: ----------- | 82 | 00 | -----------( Відзначимо,
    однак, що в регістрах числа зберігаються в нормальному вигляді: -----------
    AX | 00 | 82 | ----------- AH AL) "перевернути" подання використовується
    і при зберіганні в памятіцелих чисел розміром в подвійне слово: у першій його байті
    размещаютсямладшіе 8 бітів числа, у другому байті - попередні 8 бітів і т.д.
    На-приклад, число 12345678h зберігається в пам'яті так: --------------------- | 78
    | 56 | 34 | 12 | --------------------- Іншими словами, в першому слові подвійного
    слова розміщуються молодші (праві) 16 бітів числа, а в другому слові - старші
    16 бітів, прічемв кожному з цих двох слів в свою чергу використовується "перевернуте" подання.
    Таке незвичайне подання чисел пояснюється тим, що
    в первихмоделях ПК за раз можна було вважати з пам'яті тільки один байт і чтовсе
    арифметичні операції над багатозначними числами починаються сдействій над молодшими
    цифрами, тому з пам'яті в першу чергу надосчітивать молодші цифри,
    якщо відразу не можна вважати всі цифри. Учітиваяето, в перший ПК і стали розміщувати
    молодші цифри числа перед старшіміціфраммі, а заради наступності таке подання
    чисел зберегли впоследующіх моделях ПК. Звичайно, "перевернуте" подання
    незручно для людей, однакопрі використання мови асемблера цю незручність
    не відчувається: вMASM всі числа записуються в нормальному, неперевернутом
    вигляді (див. ні-же). Цілі числа зі знаком. Ці числа також подаються у вигляді
    байти, слова та подвійного сло-ва. У вигляді байти записуються числа від -128 до 127,
    у вигляді слова-числа від -32768 до 32767, а у вигляді подвійного слова - числа від-2147483648
    до 2147483647. При цьому числа записуються в додаткових паном коді: невід'ємне
    число записується так само, як і беззнаковоечісло (тобто в прямому
    коді), а негативне число-x (x> 0) представля-ється беззнакові числом 2 ^ 8-x
    (для байтів), 2 ^ 16-x (для слів) або 2 ^ 32-x (для подвійних слів). Наприклад, додатковим
    кодом числа -6 яв-ний байт FAh (= 256-6), слово FFFAh або подвійне слово
    FFFFFFFAh. Пріетом байт 10000000b (= 80h) трактується як -128, а не як 128
    (слово8000h розуміється як -32678), тому лівий біт додаткового кодавсегда
    відіграє роль знакового: для невід'ємних чисел він дорівнює 0, для негативних
    - 1. Знакові числа розміром в слово і подвійне слово записуються в па-мяті в
    "перевернутому" вигляді (при цьому знаковий біт виявляється в пос-Ледней байті комірки).
    Але в MASM ці числа, як і беззнакові, записи-вають в нормальній формі.
    Іноді число-байт необхідно розширити до слова, тобто потрібно полу-чить таке ж за
    величиною число, але розміром в слово. Існує дваспособа такого розширення
    - Без знаку і зі знаком. У будь-якому разі ви-Ходна число-байт потрапляє в другій
    (до "перевертання") байт сло-ва, а от перший байт заповнюється по-різному:
    при розширенні без знакав нього записуються нульові біти (12h -> 0012h), а при
    розширення сознаком в перший байт записуються нулі, якщо число-байт було неотріца-тельно,
    і записується вісім двійкових одиниць у противному випадку (81h-> FF81h).
    Іншими словами, при розширенні зі знаком в першу байтеслова копіюється
    знаковий розряд числа-байти. Аналогічно відбувається розширення числа-слова до подвійного
    слова. 1.2.2 Особливості виконання арифметичних опреацій У ПК є
    команди додавання і віднімання цілих чисел розміром вслово і байт. Спеціальних команд
    для додавання і віднімання подвійних словнет, ці операції реалізуються через
    команди додавання і віднімання слів. Додавання і віднімання беззнаковаих чисел проводиться
    за модулем 2 ^ 8для байтів і 2 ^ 16 для слів. Це означає, що якщо в результаті
    скласти-ня з'явилася одиниця переносу, не вміщаються в розрядну сітку,
    тоона відкидається. Наприклад, при складанні байтів 128 і 130 получаетсячісло 258
    = 100000010b, тому ліва двійкова одиниця відкидається іостается число 2
    = 10b, яке і оголошується результатом сложенія.Ошібка тут не фіксується,
    але в прапор переносу CF записується 1 (ес-ли переносу не було, в CF заноситься 0).
    "Зловити" таке спотворення сум-ми можна тільки подальшим аналізом прапора CF.
    Спотворення результату відбувається і при віднімання з меншого чіслабольшего. І тут
    не фіксується помилка, однак перші числа дається "позика одиниці" (у разі
    байтів це число збільшується на 256, дляслов - на 2 ^ 16), після чого і проводиться
    віднімання. Наприклад, вичі-таніе байтів 2 і 3 зводиться до віднімання чисел 256 +2 = 258
    і 3, в резуль-Таті чого виходить неправильна різниця 255 (а не -1).
    Для тогочтоби можна було виявити таку ситуацію, в прапор переносу CF Зано-сітся
    1 (якщо позики не було, в CF записується 0). Додавання і віднімання знакових
    цілих чисел проводиться за тим жеалгорітмам, що і для беззнакових чисел (у цьому
    одне з достоїнств до-полнітельного коди): знакові числа розглядаються як
    відповідаю-щие беззнакові числа, проізодітся операція над цими беззнакові
    чи-сламі та отриманий результат інтерпретується як знакове число. Нап-Рімера,
    складання байтових чисел 1 і -2 відбувається так: беруться їх до-полнітельние
    коди 1 і (256-2) = 254, обчислюється сума цих велічін1 +254 = 255 і вона трактується
    як знакове число -1 (255 = 256-1). Якщо прітаком складання виникла одиниця переносу,
    то вона, як завжди, отбраси-ється, а прапор CF отримує значення 1. Однак
    в даному випадку це від-розтин не представляє інтерес - результат операції буде
    правильним, наприклад: 3 + (-2) => 3 +254 (mod 256) = 257 (mod 256) = 1. Зате тут
    віз-можна інша неприємність: модуль суми (її мантиса) може превзойтідопустімую
    кордон і "залізти" в знаковий розряд, зіпсували його. Напри-мер, при складанні
    байтових чисел 127 і 2 виходить величина 129 == 100001001b, що представляє
    додатковий код числа -127 (= 256-129). Хоча результат тут вийшов і неправильним,
    процесор не фіксіруетошібку, але зате заносить 1 в прапор переповнення OF
    (якщо "переполненіямантісси" не було, в OF записується 0). Аналізуючи потім
    цей прапор, можна "зловити" таку помилку. Таким чином, додавання (віднімання) знакових
    і беззнакових чіселпроізводітся з одного й того ж алгоритму. При цьому
    ПК не "знає", які числа (зі знаком чи без) він складає; в будь-якому випадку він скла-дивает
    їх як беззнакові числа і в будь-якому випадку формує прапори CF іOF. А
    ось як інтерпретувати складові і суму, на якій з етіхфлагов звертати увагу
    - Це особиста справа автора програми. Що стосується множення і ділення знакових
    і беззнакових чисел, тооні виконуються за різними алгоритмами, різними машинними
    командами. Од-нако і у цих операцій є ряд особливостей. При збільшенні
    байтів (слів) перший співмножники зобов'язаний знаходитися в регістрі AL (AX), ре-Результатом
    ж множення є слово (подвійне слово), яке Зано-сітся в регістр AX
    (регісТри DX і AX). Тим самим при збільшенні збереженні-няются всі цифри твори.
    При розподілі байтів (слів) перший опе-ранд (ділене) повинен бути словом (подвійним
    словом) і зобов'язаний находітьсяв регістрі AX (регістрах DX і AX). Результатом
    поділу є двевелічіни розміром в байт (слово) - неповна приватне (div) і
    залишок відділення (mod); неповне приватне записується в регістр AL (AX), а ос-таток
    - В регістр AH (DX). 1.2.3 Представлення символів і рядків На символ відводиться
    одна байтів пам'яті, в який записується кодсімвола - ціле від 0 до 255.
    У ПК використовується система кодування ASCII (American Standard Code for Information
    Interchange). Вона, природний-но, не містить кодів російських букв, тому в нашій
    країні пріменяетсянекоторий варіант цієї системи з російськими літерами (зазвичай
    це альтер-нативних кодування ГОСТу). Деякі особливості цих систем кодування:
    - Код пробілу менше коду будь-якої букви, цифри і взагалі будь-якої графи-но представимо
    символу; - коди цифр впорядковані за величиною цифр і не містять пропусків, тобто
    з нерівності код ('0 ') +; наприклад, для доступу до байту з числом -5
    треба вказати вираженіеG 1, для доступу до байту з 10h - вираз G 2 і т.д.
    Якщо у директиві DB перераховані тільки символи, наприклад: S DB 'a','+',' b'тогда
    цю директиву можна записати коротше, уклавши всі ці символи водних лапки: S
    DB 'a + b' І, нарешті, якщо у директиві описується кілька однакових кон-стант
    (змінних), то можна скористатися конструкцією повторення k DUP (a, b ,..., c) яка
    еквівалентна повтореної k раз послідовності a, b ,..., c.Напрімер,
    директиви V1 DB 0,0,0,0,0 V2 DW ?,?,?,?,?,?,?,?,?,' a ', 1,2,1,2,1,2,1, 2можно записати
    більш коротко таким чином: V1 DB 5 DUP (0) V2 DW 9 DUP (?), 'a', 4 DUP (1,2)
    1.3. ПОДАННЯ КОМАНД. Модифікація адреси. 1.3.1 Структура команд. Виконавчі
    адреси Машинні команди ПК займають від 1 до 6 байтів. Код операції (КОП)
    займає один або два перших байтів команди. ВПК настільки багато різних операцій,
    що для них не вистачає 256 различ-них КОПів, які можна представити в
    одному байті. Тому некоториеопераціі об'єднуються в групи і їм дається один і
    Того ж КОП, у дру-ром ж байті цей КОП уточнюється. Крім того, у другому байті
    Вказуючи-ются типи і спосіб адресації операндів. Решта байти команди укази-вають
    на операнди. Команди можуть мати від 0 до 3 операндів, у більшості команд
    -один або два операнда. Розмір операндів - байт або слово (рідко-подвійне слово).
    Операнд має бути зазначено у самій команді (це т.н.непосредственний операнд),
    або може перебувати в одному з регістровПК і тоді в команді вказується
    цей регістр, або може перебувати вячейке пам'яті і тоді в команді тих чи інших
    способом вказується ад-рес цього осередку. Деякі команди вимагають, щоб операнд
    перебував вфіксірованном місці (наприклад, в регістрі AX), тоді операнд
    явно неуказивается в команді. Результат виконання команди поміщається в ре-гістр
    або комірку пам'яті, з якого (яку), як правило, беретсяпервий операнд.
    Наприклад, більшість команд з двома операндами реалі-зуются дію op1: = op1
    ? op2где op1 - регістр або комірка, а op2 - безпосередній операнд, ре-гістр
    або осередок. Адреса операнда дозволено модифіковані з одного або двох РЕГИСТ-рам.
    У першому випадку як регістра-модифікатора дозволено ис-пользовать регістр
    BX, BP, SI або DI (і ніякий інший). У другому слу-чай один з модифікаторів
    зобов'язаний бути регістром BX або BP, а інший-регістром SI або DI; одночасна
    модифікація з BX і BP або SI і DIнедопустіма. Регістри BX і BP зазвичай використовуються
    для зберігання бази (початкової адреси) деякої ділянки пам'яті (скажімо,
    масиву) і по-тому називаються базовими регістрами, а регістри SI і DI часто содержатіндекси
    елементів масиву і тому називаються індексними регістрамі.Однако
    такий розподіл ролей необов'язково, і, наприклад, в SI мо-жет знаходитися база
    масиву, а в BX - індекс елемента масиву. У MASM адреса в командах записуються
    у вигляді однієї з следующіхконструкціі: A, A [M] або A [M1] [M2], де A - адреса,
    M - регістр BX, BP, SI або DI, M1 - регістр BX або BP, а M2 - регістр SI або DI.
    Під второрм і третьому варіанті A може відсутність про-ствовать, в цьому випадку вважається,
    що A = 0. При виконанні команди процесор насамперед обчислює т.зв. ис-полнітельний
    (ефективний) адреса - як суму адреси, заданого в ко-команді, і поточних
    значень зазначених регістрів-модифікаторів, прічемвсе ці величини розглядаються
    як невід'ємні і суммірованіеведется за модулем 2 ^ 16 ([r] означає вміст
    регістра r): A: Aісп = AA [M]: Aісп = A + [M] (mod 2 ^ 16) A [M1] [M2]:
    Aісп = A + [M1] + [M2] (mod 2 ^ 16) Отриманий таким чином 16-розрядний адреса визначає
    т.зв. зміщений-гом - адреса, відраховувати від початку деякого сегмента (області)
    пам'я-ти. Перед зверненням до пам'яті процесор ще додає до зсуву на-чільного
    адресу цього сегменту (він зберігається в деякому сегментному регі-стре), в результаті
    чого виходить остаточний 20-розрядний ад-рес, за яким і відбувається
    реальне звернення до пам'яті (див. 1.4). 1.3.2 Формати команд У ПК формати машинних
    команд досить різноманітні. Для прімерапріведем лише основні формати
    команд з двома операндами. 1) Формат "регістр-регістр" (2байта): -------------
    ---------------- | КОП | d | w | | 11 | reg1 | reg2 | ------------- ------- ---------
    7 2 1 0 7 6 5 3 2 0Команди цього формату описують зазвичай дію reg1: = reg1? Reg2
    іліreg2: = reg2? reg1. Поле КОП першого байта вказує на операцію (?), Ко-торую
    треба виконати. Біт w визначає розмір операндів, а біт d ука-показують, в якій
    з регістрів записується результат: w = 1 - слова d = 1 - reg1: = reg1? reg2
    = 0 - байти = 0 - reg2: = reg2? Reg1Во другу байті два лівих біта фіксовані (для
    даного формату), атрехбітовие поля reg1 і reg2 вказують на регістри, що беруть участь
    в опе-рації, згідно наступної таблиці: reg w = 1 w = 0 reg w = 1 w = 0 -----------------
    ----------------- 000 AX AL 100 SP AH 001 CX CL 101 BP CH 010 DX DL
    110 SI DH 011 BX BL 111 DI BH 2) Формат "регістр-пам'ять" (2-4 байти): -------------
    ------------- ------------------- | КОП | d | w | | mod | reg | mem | | адреса (0 -2 байти) |
    ------------- ------------- ------------------- Ці команди описують операції < br /> reg: = reg? mem або mem: = mem? reg. Біт wпервого байти визначає розмір операндів
    (див. вище), а біт d вказуючи-і, куди записується результат: в регістр (d = 1)
    або в комірку пам'яті (d = 0). Трехбітовое поле reg другому байти вказує операнд-регістр (див.
    вище), двухбітовое поле mod визначає, скільки байтів в командезанімает
    операнд-адреса (00 - 0 байтів, 01 - 1 байт, 10 - 2 байти), атрехбітовое поле
    mem вказує спосіб модифікації цієї адреси. В сле-дме таблиці вказані
    правила обчислення виконавчого адреса в за-лежно від значень полів mod
    і mem (a8 - адреса розміром в байт, a16-адреса розміром в слово): mem mod |
    00 01 10 ---------- ------------------------------------- -------- 000 | [BX] + [SI]
    [BX] + [SI] + a8 [BX] + [SI] + a16 001 | [BX] + [DI] [BX] + [DI] + a8 [BX] + [DI] + a16 010 | [BP] + [SI]
    [BP] + [SI] + a8 [BP] + [SI] + a16 011 | [BP] + [DI] [BP] + [DI] + a8 [BP] + [DI] + a16
    100 | [SI] [SI] + a8 [SI] + a16 101 | [DI] [DI] + a8 [DI] + a16 110 | a16 [BP] + a8 [BP] + a16
    111 | [BX] [BX] + a8 [BX] + a16 Зауваження. Якщо в команді не задано адресу, то він
    вважається нулевим.Еслі адреса задано у вигляді байт (a8), то він автоматично розширюється
    сознаком до слова (a16). Випадок mod = 00 і mem = 110 вказує на отсутствіерегістров-модифікаторів,
    при цьому адреса должет мати розмір слова (ад-РЕКН вираз
    [BP] асемблер транслює в mod = 01 і mem = 110 пріa8 = 0). Випадок mod = 11 відповідає
    формату "регістр-регістр". 3) Формат "регістр-безпосередній операнд"
    (3-4 байти): ----------- ------------- ------------------- ------- | КОП | s | w |
    | 11 | КОП "| reg | | непосред.операнд (1-2 б) | ----------- ------------- ------- ------------------- Команди
    цього формату описують операції reg: = reg? immed (immed
    - Не-посередній операнд). Біт w вказує на розмір операндів, а полеreg
    - На регістр-операнд (див. вище). Поле КОП в першому байті визначаються-і лише клас
    операції (наприклад, клас додавання), уточнює ж опера-цію поле КОП "з другого
    байти. Безпосередній операнд може зани-мати 1 або 2 байти - залежно
    від значення біта w, при цьому опе-ранд-слово записується в команді в "перевернутому"
    вигляді. Ради економііпамяті в ПК передбачений випадок, коли в операції над
    словами Непос-редственний операнд може бути заданий байтом (на цей випадок указивает1
    в бите s при w = 1), і тоді перед виконанням операції байт автомати-но
    розширюється (зі знаком) до слова. 4) Формат "пам'ять-безпосередній операнд"
    (3-6 байт): ----------- -------------- -------------- ---- -------------- | КОП
    | s | w | | mod | КОП "| mem | | адреса (0-2б) | | непоср.оп (1-2б) | ----------- -------- ------
    -------------- ------------------ Команди цього формату описують операції
    типу mem: = mem? immed. Смислвсех полів - той же, що і в попередніх форматах. Крім
    розглянутих в ПК використовуються й інші формати команди сдвумя операндами;
    так, передбачений спеціальний формат для команд, один з операндів яких фіксований
    (зазвичай це регістр AX). Імеютсвоі формати і команди з іншим числом операндів.
    1.3.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) 1.4. СЕГМЕНТІРОВНІЕ 1.4.1 Сегменти пам'яті. Сегментні
    регістри. Перші моделі ПК мали оперативну пам'ять об'ємом 2 ^ 16 байт (64Кб)
    і тому використовували 16-бітові адреси. У наступних моделяхпамять була
    збільшена до 2 ^ 20 байт (1Мб = 1000Кб), для чого вже необ-ходимо 20-бітові
    адреси. Однак у цих ПК заради збереження спадкоємства-ності були збережені 16-бітові
    адреса: саме такі адреси зберігаються врегістрах і вказуються в командах,
    саме такі адреси виходять врезультате модмфікаціі з базових та індексних регістрів.
    Як же вдається-ся 16-бітовими адресами посилатися на 1Мб пам'яті? Ця проблема
    вирішується за допомогою сегментації адрес (неявногобазірованія адрес).
    У ПК вводиться поняття "сегмент пам'яті". Так на-ни опиняються будь-яку ділянку пам'яті розміром
    до 64Кб і з початковим адресою, кратним 16. Абсолютний (20-бітовий) адреса
    A будь-якої комірки пам'яті можнопредставіть як суму 20-бітового початкового адреси
    (бази) B сегмента, якому належить комірка, і 16-бітового зміщення D - адреси
    етойячейкі, відраховувати від початку сегменту: A = B + D. (Неоднозначність вибо-ра
    сегмента не відіграє суттєвої ролі, головне - щоб сума B і Dдавала потрібний
    адресу.) Адреса B заноситься в деякий регістр S, а в ко-команді, де повинен бути
    вказана адреса A, замість нього записується параіз регістра S і зміщення D (в MASM
    така пара, яка називається адресної па-рій або покажчиком, записується як S: D).
    Процесор ж влаштований так, що при виконанні команди він перш за все по парі S: D
    обчислює абсо-лютень адреса A як суму вмісту регістра S і зміщення D
    і толькозатем звертається до пам'яті за цією адресою A. Ось так, замінюючи в коман-дах
    абсолютні адреси на адресні пари, і вдається адресувати всю па-м'яти 16-бітовими
    адресами (зміщеннями). Як регістра S дозволяється використовувати не будь-який
    регістр, атолько один з 4 регістрів, званих сегментними: CS, DS, SS і
    ES. У зв'язку з цим одночасно можна працювати з 4 сегментами пам'яті: началоодного
    з них завантажується в регістр CS і всі посилання на клітинки етогосегмента вказуються
    у вигляді пар CS: D, початок іншого заноситься в DS івсе посилання на його осередку задаються
    у вигляді пар DS: D і т.д. Якщо одночасним-обелівську треба працювати з великим числом
    сегментів, тоді потрібно вчасно-обелівську рятувати вміст сегментних регістрів
    і записувати в них на-чільного адреси п'ятого, шостого і т.д. сегментів. Відзначимо,
    що використовуються сегменти можуть бути розташовані в памятіпроізвольним чином:
    вони можуть не перетинатися, а можуть пересекатьсяі навіть збігатися. Які сегменти
    пам'яті використовувати, в яких сегмент-них регістрах зберігати їх початкові адреси
    - Все це особиста справа авторамашінной програми. Як і всі регістри ПК, сегментні
    регістри мають розмір слова. По-цьому виникає питання: як вдається розмістити
    в них 20-бітові на-чільного адреси сегментів пам'яті? Відповідь така. Оскільки
    всі ці адресакратни 16 (див. вище), то в них молодші 4 біта (остання 16-річнаяціфра)
    завжди нульові, а тому ці біти можна не зберігати явно, а лішьподразумевать.
    Саме так і робиться: у сегментному регістрі всегдахранятся тільки перші
    16 бітів (перші чотири 16-ковий цифри) на-чільного адреси сегмента (ця величина
    називається номером сегмента іліпросто сегментом). При обчисленні ж повної
    адреси A по парі S: Dпроцессор спочатку приписує справа до вмісту
    регістра S четиренулевих біта (іншими словами, множить на 16) і лише потім прібавляетсмещеніе
    D, причому підсумовування ведеться по модулю 2 ^ 20: Aабс = 16 * [S] + D
    (mod 2 ^ 20) Якщо, наприклад, в регістрі CS зберігається величина 1234h, тоді адреснаяпара
    1234h: 507h визначає абсолютний адреса, що дорівнює 16 * 1234h +507 h = 12340h +507 h
    = 12847h. 1.4.2 Сегментні регістри за замовчуванням Згідно з описаною схемою сегментації
    адрес, заміну абсолют-них адрес на адресні пари треба проводити
    у всіх командах, имею-щих операнд-адресу. Однак розробники ПК придумали
    спосіб, дозволяю-щий уникнути виписування таких пар у більшості команд. Суть
    його втом, що заздалегідь домовляються про те, який сегментний регістр на ка-кой
    сегмент пам'яті буде вказувати, і що в командах задається толькосмещеніе: не вказаний
    явно сегментний регістр автоматично віднов-встановлюються згідно з цією
    домовленістю. І тільки при необходімостінарушіть цю домовленість треба повністю
    вказувати адресну пару. Що це за домовленість? Вважається, що регістр
    CS завжди вказує на початок області пам'я-ти, в якій розміщені команди програми
    (ця область називається сег-ментом команд або сегментом кодів), і тому
    при посиланнях на ячейкіетой області регістр CS можна не вказувати явно, він мається на увазі
    поумолчанію. (Відзначимо попутно, що абсолютний адреса чергової команди, що підлягає
    виконання, завжди задається парою CS: IP: в лічильнику командIP завжди
    знаходиться зміщення цієї команди щодо адреси з регі-стра CS.) Аналогічно
    передбачається, що регістр DS вказує на сег-мент даних (область пам'яті
    з константами, змінними та іншими вели-чинами програми), і тому в усіх
    посиланнях на цей сегмент регістр DSможно явно не вказувати, тому що він мається на увазі
    за умовчанням. РегістрSS, вважається, вказує на стек - область пам'яті, доступ
    до которойосуществляется за принципом "останнім записаний - перша лічений" (см.1.7),
    і тому всі посилання на стек, в яких явно не вказано сегментнийрегістр,
    за замовчуванням сегментуються за регістром SS. Регістр ES вва-ся вільним,
    він не прив'язаний ні до якого сегменту пам'яті і його можноіспользовать на свій розсуд;
    найчастіше він застосовується для дос-тупа до даних, які не помістилися
    або свідомо не були размеще-ни в сегменті даних. З урахуванням такого розподілу
    ролей сегментних регістрів машінниепрограмми зазвичай будуються так: усі команди
    програми розміщуються в од-ному сегменті пам'яті, початок якого заноситься
    в регістр CS, а вседанние розміщуються в іншому сегменті, початок якого заноситься
    в ре-гістр DS; якщо потрібен стек, то під нього відводиться третій сегмент пам'я-ти,
    початок якого записується в регістр SS. Після цього практіческіво всіх
    командах можна вказувати не повні адресні пари, а лише кош-вання, тому що сегментні
    регістри в цих парах будуть восстанавліватьсяавтоматіческі. Тут, щоправда,
    виникає таке питання: як по зміщенню визначити, на який сегмент пам'яті воно
    вказує? Точну відповідь наведено нижче (см.1.4.3), а в загальних рисах він такий: посилання
    на сегмент команд можуть битьтолько у командах переходу, а посилання практично
    у всіх інших коман-дах (крім строкових
         
     
         
    Реферат Банк
     
    Рефераты
     
    Бесплатные рефераты
     

     

     

     

     

     

     

     
     
     
      Все права защищены. Reff.net.ua - українські реферати ! DMCA.com Protection Status