Мова макроассемблера IBM PC
Це перехід — внутрисегментныйили межсегментный? Відповідь залежить від цього, як описано. Кордон і направлення «залізти «в знаковий розряд, зіпсувавши його. Напер-мір, при додаванні. Знаковий розряд числа-байта. Аналогічно відбувається розширення числа-слова до подвійного. Число до поточному значенням регістру IP, одержуючи у ньому адресу (смеще-ние) тієї команди,. Слова чи двойногослова… Читати ще >
Мова макроассемблера IBM PC (реферат, курсова, диплом, контрольна)
МОВА МАКРОАССЕМБЛЕРА IBM PC (Довідкове посібник) Упорядник: В. Н. Пильщиков (МДУ,.
ВМК) (січень 1992 р.) У посібнику розглядається мову макроассеблера для персональних.
ЭВМтипа IBM PC (мову MASM, версія 4.0). Посібник складається з 4-х глав. У розділі.
1 розглянуті особливості пер-сональных комп’ютерів типу IBM PC і приведені.
початкові відомості оязыке MASM. У розділі 2 описується система команд цих компьютеров.Глава.
3 присвячена присвячена власне мови MASM. У розділі 4 приведеныпримеры.
фрагментів програм, тож повних програм на MASM на вирішення раз-личных завдань.
У посібнику не розглядаються питання, пов’язані з обробкою дво-ично-десятичных.
чисел і клубною роботою арифметичного співпроцесора 8087 или80 287. Під терміном.
" ПК «в посібнику розуміється персонального комп’ютера типаIBM PC з мікропроцесором.
8088/8086, 80 186 чи 80 286. ГЛАВА 1. ОСОБЛИВОСТІ ПК. ЗАПРОВАДЖЕННЯ У MASM. 1.1. ОПЕРАТИВНА.
ПАМ’ЯТЬ. РЕГІСТРИ. 1.1.1 Оперативна пам’ять Обсяг оперативної пам’яті ПК.
— 220 байтів (1 МБ). Байти нумеруютсяначиная з 0, номер байта називається його адресою.
Для посилань на байтыпамяти використовуються 20-разрядные адреси: від 0 до.
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, база; З — counter, лічильник; D — data, дані; BP — base pointer,.
ука-затель бази; SI — source index, індекс джерела; DI — destinationindex, індекс.
приймача; SP — stack pointer, покажчик стека; CScode segment, сегмент.
команд; DS — data segment, сегмент даних; SSstack 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) — прапор переповнення. Встановлюється один, еслипри додаванні.
чи вирахуванні цілих чисел зі знаком вийшов результат, по модулю переважаючий.
допустиму величину (сталося переполнениемантиссы і її «залізла «в знаковий.
розряд). ZF (zero flag) — прапор нуля. Встановлюється один, якщо результаткоманды.
дорівнював 0. SF (sign flag) — прапор знака. Встановлюється один, якщо.
в операциинад знаковими числами вийшов негативний результат. 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 (=28−1), як слова — цілі від 0 до 65 535 (=216−1),.
ввиде подвійного слова — цілі від 0 до запланованих 4 294 967 295 (=232−1). Числа за-писываются.
в двоичной системі числення, займаючи все розряди ячейки. Например, число 130.
записується як байта 1 000 0010b (82h). Числа площею слово зберігаються у.
пам’яті в «перевернутому «виде:младщие (праві) 8 бітов числа розміщуються у першому.
байте слова, астаршие 8 бітов — у другому байті (в 16-ричной системі: дві правыецифры.
— у першому байте, дві ліві цифри — у другому байте). Например, число.
130 (=0082h) як слова зберігається у пам’яті так: —————- | 82 | 00 | —————-(Зазначимо,.
проте, що у регістрах числа зберігаються у нормальному вигляді: —————;
AX | 00 | 82 | —————- AH AL) «Перевернуте «уявлення використовується.
і за зберіганні у памятицелых чисел площею подвійне слово: у першому його байте.
размещаютсямладшие 8 бітов числа, у другому байті - попередні 8 бітов тощо.
На-приклад, число 1 234 5678h зберігається у пам’яті так: ——————————- | 78.
| 56 | 34 | 12 | ——————————-Інакше кажучи, у першому слові подвійного.
слова розміщуються младшие (правые) 16 бітов числа, тоді як у другому слові - старші.
16 бітов, причемв кожному з цих двох слів своєю чергою використовується «перевернуте «уявлення.
Таке незвичне уявлення чисел пояснюється лише тим, що.
в первыхмоделях ПК воднораз можна було з пам’яті лише одне байт і чтовсе.
арифметичні операції над багатозначними числами починаються сдействий над молодшими.
цифрами, тому з пам’яті насамперед надосчитывать молодші цифри,.
якщо одразу ж не вважається все цифри. Учитываяэто, у перших ПК і вони розміщувати.
молодші цифри числа перед старшимицифрамми, а заради наступності таке уявлення.
чисел зберегли впоследующих моделях ПК. Звісно, «перевернуте «уявлення.
незручно для таких людей, однакопри використанні мови ассемблера це незручність.
відчувається: вMASM все числа записуються нормального, неперевернутом.
вигляді (див. ни-же). Цілі числа зі знаком. Ці числа також видаються як.
байта, слова подвійного сло-ва. У нинішньому вигляді байта записуються числа від -128 до 127,.
як словачисла від -32 768 до 32 767, а вигляді подвійного слова — числа от-2 147 483 648.
до 2 147 483 647. У цьому числа записуються в дополнитель-ном коді: ненегативне.
число записується як і, як і беззнаковоечисло (тобто. у прямому.
коді), а негативне числоx (x>0) представля-ется беззнаковым числом 28-x.
(для байтів), 216-x (для слів) или232-x (для подвійних слів). Наприклад, додатковим.
кодом числа -6 яв-ляется байт FAh (=256−6), слово FFFAh чи подвійне слово.
FFFFFFFAh. Приэтом байт 1 000 0000b (=80h) сприймається як -128, ніж як +128.
(слово8000h сприймається як -32 678), тому лівий біт додаткового кодавсегда.
ж виконує функцію знакового: для неотрицательных чисел він дорівнює 0, для негативних.
— 1. Знакові числа площею словом, і подвійне слово записуються в па-мяти в.
" перевернутому «вигляді (у своїй знаковий біт перебувають у пос-леднем байте осередки).
Однак у MASM ці числа, як і беззнаковые, записы-ваются за нормальної формі.
Іноді число-байт необхідно розширити до слова, тобто. потрібно полу-чить таку ж по.
величині число, але площею слово. Існує дваспособа такого розширення.
— без знака і з знаком. У кожному разі ис-ходное число-байт потрапляє на другий.
(до «перекидання ») байт сло-ва, тоді як перший байт заповнюється по-різному:
у результаті розширення без знакав нього записуються нульові біти (12h -> 0012h), а при.
розширенні сознаком у байт записуються нулі, якщо число-байт було неотрица-тельным,.
і записується вісім двійкових одиниць на іншому разі (81h-> FF81h).
Інакше кажучи, у результаті розширення зі знаком у першому байтеслова копіюється.
знаковий розряд числа-байта. Аналогічно відбувається розширення числа-слова до подвійного.
слова. 1.2.2 Особливості виконання арифметичних опреаций У ПК є.
команди складання і вирахування цілих чисел розміром вслово і байт. Спеціальних команд.
для складання і вирахування подвійних словнет, ці операції реалізуються через.
команди складання і вирахування слів. Складання і віднімання беззнаковаых чисел виробляється.
по модулю 2^8для байтів і 216 для слів. Це означає, що у результаті.
сложе-ния з’явилася одиниця перенесення, не вмещающаяся в розрядну сітку,.
тоона відкидається. Наприклад, при додаванні байтів 128 і 130 получаетсячисло 258.
= 10 000 0010b, тому ліва двоичная одиниця відкидається иостается число 2.
= 10b, що й оголошується результатом сложения. Ошибка не фіксується,.
але у прапор перенесення CF записується 1 (якщо перенесення був, в CF заноситься 0).
" Впіймати «таке спотворення сум-мы можна тільки наступним аналізом прапора CF.
Спотворення результату є і при віднімання з меншого числабольшего. І тут.
не фіксується помилка, проте першого числа дається «позику одиниці «(у разі.
байтів їх кількість поповнюється 256, дляслов — на 216), після чого став і виробляється.
віднімання. Наприклад, вычи-тание байтів 2 і трьох зводиться до віднімання чисел 256+2=258.
і трьох, в резуль-тате чого виходить неправильна різницю 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 == 10 000 1001b, що становить.
додатковий код числа -127 (=256−129).Хотя результат тут вийшов і неправильним,.
процесор не фиксируетошибку, зате заносить 1 в прапор переповнення OF.
(якщо «переполнениямантиссы «був, в OF записується 0). Аналізуючи потім.
цей флаг, можно «впіймати «таку помилку. Отже, складання (віднімання) знакових.
і беззнаковых чиселпроизводится за одним й тому алгоритму. У цьому.
ПК не «знає «, які числа (зі знаком чи ні) він складає; у разі він скла-дывает.
їх як беззнаковые числа і у будь-якому разі формує прапори CF иOF. А.
і як інтерпретувати складові суму, який з этихфлагов зважати.
— це справа автора програми. Що ж до множення і розподілу знакових.
і беззнаковых чисел, тоони виконуються з різних алгоритмам, різними машинними.
командами. Од-нако і в операцій є низка особливостей. При множенні.
байтов (слов) перший множене зобов’язаний перебувати у регістрі AL (AX), ре-зультатом.
ж множення є слово (подвійне слово), яке зано-сится в регістр AX.
(регістри DX і AX). Тим самим було при множенні сохра-няются все цифри твори.
При розподілі байтів (слів) перший опе-ранд (подільне) може бути словом (подвійним.
словом) і зобов’язаний находитьсяв регістрі AX (регістрах DX і AX). Результатом.
розподілу є двевеличины площею байт (слово) — неповне приватне (divx) і.
залишок відділення (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 перелічую лише символи, наприклад: P. S DB «a », «+ », «b «тоді.
цю директиву можна записати коротше, уклавши всі ці символи водни лапки: P.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. За виконання команди процесор передусім обчислює т.зв. ис-полнительный.
(ефективний) адресу — як сукупність адреси, заданого в ко-манде, і поточних.
значень зазначених регистров-модификаторов, причемвсе ці величини розглядаються.
як неотрицательные і суммированиеведется по модулю 216 ([r] означає вміст.
регістру r): A: Aисп = A A[M]: Aисп = A+[M] (mod 216) A[M1][M2]:
Aисп = A+[M1]+[M2] (mod 216) Отриманий в такий спосіб 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 байта)|.
——————- ——————- —————————-Ці команди описують операції.
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.
в бите p. 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 Сегменти пам’яті. Сегментні.
регістри. Перші моделі ПК мали оперативну пам’ять обсягом 216 байтов (64Кб).
і тому використовували 16-битовые адреси. У наступних моделяхпамять була.
збільшена до 220 байтів (1Мб=1000Кб), навіщо вже необ-ходимы 20-битовые.
адреси. Однак цих ПК для збереження преемствен-ности було збережено 16-битовые.
адреси: саме такі адреси зберігаються врегистрах і вказуються в командах,.
саме такі адреси виходять врезультате модмфикации з базових і індексним регістрам.
Які ж удает-ся 16-битовыми адресами посилатися на 1Мб пам’яті? Проблема.
вирішується питання з допомогою сегментування адрес (неявногобазирования адрес).
У ПК вводиться поняття «сегмент пам’яті «. Так на-зывается будь-яку ділянку пам’яті розміром.
до 64Кб і з початковим адресом, кратным 16. Абсолютний (20-битовый) адресу.
A будь-який осередки пам’яті можнопредставить як сукупність 20-битового початкового адреси.
(бази) B сегмента, которому належить осередок, і 16-битового усунення D — адреси.
этойячейки, отсчитанного з початку сегмента: A=B+D. (Неоднозначність выбо-ра.
сегмента не відіграє ролі, головне — щоб сума B і Dдавала потрібний.
адресу.) Адреса B заноситься в певний регістр P. S, а ко-манде, де вона має бути.
зазначений адресу A, замість нього записується параиз регістру P. S і усунення D (в MASM.
така пара, звана адресної па-рой чи покажчиком, записується як S: D).
Процесор ж, влаштований так, что і під час команди він передовсім Рижукових по парі S: D.
обчислює абсо-лютный адресу A як сукупність вмісту регістру P. S і усунення D.
і толькозатем звертається до пам’яті за цією адресою A. Отак, замінюючи в коман-дах.
абсолютні адреси на адресні пари, і адресувати всю па-мять 16-битовыми.
адресами (зміщеннями). Як регістру P. S дозволяється використовувати не будь-який.
регістр, атолько одне із 4 регістрів, званих сегментными: CS, DS, SS і.
ES. Всвязи з цим одночасно можна працювати із чотирьох сегментами пам’яті: началоодного.
їх завантажується в регістр CS і всі на осередки этогосегмента вказуються.
як пар CS: D, початок наступного заноситься в DS ивсе посилання його осередки задаються.
як пар DS: D тощо. Якщо одновре-менно треба працювати з великою кількістю.
сегментів, тоді доведеться своевре-менно рятувати вміст сегментних регістрів.
і нотувати у них на-чальные адреси п’ятого, шостого тощо. сегментів. Зазначимо,.
використовуються сегменти можуть лежати в памятипроизвольным чином:
можуть не перетинатися, а можуть пересекатьсяи навіть збігатися. Які сегменти.
пам’яті використовувати, у яких сегмент-ных регістрах зберігати початкові адреси.
— усе це особисту справу авторамашинной програми. Як і регістри ПК, сегментні.
регістри мають розмір слова. По-цьому виникає запитання: як розмістити.
у яких 20-битовые на-чальные адреси сегментів пам’яті? Відповідь такий. Оскільки.
всі ці адресакратны 16 (див. вище), то них молодші 4 біта (остання 16-ричнаяцифра).
завжди нульові, тому ці біти годі й зберігати явно, а лишьподразумевать.
Саме так робиться: в сегментном регістрі всегдахранятся лише.
16 бітов (перші чотири 16-ричные цифри) на-чального адреси сегмента (їх кількість.
називається номером сегмента илипросто сегментом). При обчисленні ж абсолютного.
адреси A по парі S: Dпроцессор спочатку приписує справа до.
регістру P. S четыренулевых біта (інакше кажучи, множить на 16) і потім прибавляетсмещение.
D, причому підсумовування ведеться за модулю 220: Aабс = 16*[S]+D.
(mod 220)Если, наприклад, в регістрі CS зберігається величина 1234h, тоді адреснаяпара.
1234h:507h визначає абсолютний адресу, рівний 16*1234h+507h =12340h+507h.
= 12847h. 1.4.2 Сегментні регістри за умовчанням Відповідно до описаної схемою сегментування.
адрес, заміну абсолют-ных адрес на адресні пари мають провадитися.
переважають у всіх командах, имею-щих операнд-адрес. Проте розробники ПК придумали.
спосіб, позволяю-щий уникнути виписування таких пар переважно команд. Суть.
його втом, що заздалегідь домовляються у тому, який сегментний регістр на ка-кой.
сегмент пам’яті буде вказувати, і у командах задається толькосмещение: не зазначений.
явно сегментний регістр автоматично восста-навливается відповідно до цієї.
домовленості. І лише за необходимостинарушить цю домовленість треба повністю.
вказувати адресну пару. Що за домовленість? Вважається, що регістр
CS завжди свідчить про початок області памя-ти, у якій розміщені команди програми.
(ця галузь називається сег-ментом команд чи сегментом кодів), і тому.
при посиланнях на ячейкиэтой області регістр CS годі й вказувати явно, він мається на увазі.
поумолчанию. (Зазначимо принагідно, що абсолютний адресу черговий команды, подлежащей.
виконання, завжди задається парою CS: IP: в лічильнику командIP завжди.
перебуває усунення цієї команди щодо адреси з реги-стра CS.) Аналогічно.
передбачається, що регістр DS свідчить про сег-мент даних (область пам’яті.
з константами, перемінними та інші вели-чинами програми), і тому під всіх.
посиланнях цей сегмент регістр DSможно року вказувати, т.к. він мається на увазі.
за умовчанням. РегистрSS, вважається, свідчить про стік — область пам’яті, доступ.
до которойосуществляется за принципом «останнім записано — першим лічений «(см. 1.7),.
і тому його посилання стік, у яких року зазначений сегментныйрегистр,.
за умовчанням сегментируются по регістру SS. Регістр ES счита-ется вільним,.
не прив’язаний якого сегменту пам’яті та її можноиспользовать на власний розсуд;
найчастіше його для дос-тупа до даних, які помістилися.
чи свідомо були размеще-ны у сегменті даних. З урахуванням такого розподілу.
ролей сегментних регістрів машинныепрограммы зазвичай будуються так: все команди.
програми розміщуються в од-ном сегменті пам’яті, початок якого заноситься.
в регістр CS, а вседанные розміщуються й інші сегменті, початок якого заноситься.
в ре-гистр DS; якщо потрібен стік, то під нього відводиться третій сегмент памя-ти,.
початок якого записується в регістр SS. Після цього практическиво всіх.
командах можна вказувати не повні адресні пари, а лише сме-щения, т.к. сегментні.
регістри у тих парах будуть восстанавливатьсяавтоматически. Тут, щоправда,.
виникає таке питання: як у зміщення определить, на який сегмент пам’яті воно.
вказує? Точної відповіді наведено нижче (см. 1.4.3), а найзагальніших рисах він такий: посилання.
на сегмент команд можуть бытьтолько в командах переходу, а посилання практично.
у всіх інших коман-дах (крім строковых і стековых) — це посилання сегмент.
даних. Нап-ример, у команді пересилки MOV AX, Xимя X сприймається як посилання.
На цей, тому автоматично вос-станавливается до адресної пари DS: X.
У команді ж безумовного пере-хода за адресою, що у регістрі BX, JMP.
BXабсолютный адресу переходу визначається парою CS:[BX]. Отже, тоді як засланні на.
якусь осередок пам’яті не зазначений явно сег-ментный регістр, цей регістр береться.
за умовчанням. Явно ж сегмен-тные регістри треба вказувати, лише коли із якихось.
причин регистрпо вмовчанням не підходить. Якщо, наприклад, у команді пересилки.
нам надосослаться на стік (скажімо, треба записати в регістр AH байт стека,.
по-меченный ім'ям X), тоді нас нічого очікувати влаштовувати домовленість отом,.
що у вмовчанням операнд команди MOV сегментируется по региструDS, і тому ми.
зобов’язані явно вказати інший регістр — у разі ре-гистр SS, т.к. саме його.
свідчить про стік: MOV AH, SS: XОднако таке трапляється трапляються нечасто і тому.
командах, як прави-ло, вказуються лише усунення. Зазначимо, що у MASM сегментний.
регістр записується у самій коман-де безпосередньо перед зміщенням (ім'ям.
перемінної, міткою і т.п.), однако лише на рівні машинного мови ситуація кілька.
інша. Є 4специальные однобайтовые команди, звані префіксами заміни.
сегмен-та (обозначаемые як CS, DS, SS: і ES:). Вони ставляться перед коман-дой,.
операнд-адрес якої повинен бути просегментирован по регистру, отличному від.
регістру, подразумеваемому за умовчанням. Наприклад, приве-денная вище символічна.
команда пересилки — це насправді двемашинные команди: SS: MOV AH, X.
1.4.3 Сегментування, базування і індексування адрес Оскільки сегментування.
адрес — це різновид модификацииадресов, то ПК адресу, указываемый.
у команді, у випадку модифи-цируется по трьох регістрам — сегментному, базовому.
і індексному. У це-лом, модифікація адреси виробляється у два етапу. Спочатку.
учитываютсятолько базовий і індексний регістри (якщо вони, звісно, вказані.
в ко-манде), причому обчислення відбувається у сфері 16-битовых адре-сов;
отриманих у результаті 16-битовый адресу називається исполнитель-ным (ефективним).
адресою. Якщо команді не передбачено звернення кпамяти (наприклад, вона завантажує.
адресу в регістр), то, на цьому модифика-ция адреси завершується і використовується.
саме виконавчий адрес (он завантажується в регістр). Якщо потрібен доступ.
до пам’яті, тоді навтором етапі виконавчий адресу сприймається як усунення.
і до не-му додається (помножена на 16) вміст сегментного регистра, указанного.
явно чи взятого за умовчанням, у результаті получаетсяабсолютный.
(фізичний) 20-битовый адресу, яким це реально і проис-ходит звернення.
до пам’яті. Зазначимо, що сегментний регістр враховується лише у «останній «момент,.
безпосередньо перед зверненням до пам’яті, а доти работаведется тільки з.
16-битовыми адресами. Коли ж врахувати при цьому, що сег-ментные регістри, зазвичай,.
не вказуються в командах, можна загалом-то вважати, що ПК працює із.
16-битовыми адресами. Як сказано, тоді як засланні на осередок пам’яті не зазначений.
сегмент-ный регістр, він визначається за умовчанням. Це потрібно по следую-щим.
правилам. 1) У командах переходу адресу переходу сегментируется по региструCS.
і лише з нього, т.к. абсолютний адресу команди, яка должнабыть виконано.
наступній, завжди визначається парою CS: IP (спроба из-менить в командах.
сегментний регістр буде безуспішною). Зазначимо, що сегментиорвание по регістру.
CS стосується саме адресаперехода, а чи не адреси тієї осередки, де він може перебувати.
Наприклад, вкоманде безумовного переходу за адресою, що у осередку.
X: JMP Xимя X сегментируется по регістру DS, тоді як адресу переходу, узятий изячейки.
X, вже сегментируется по регістру CS. 2) Адреси у всіх інших командах,.
крім строковых (STOS, MOVS, SCAS і CMPS), за умовчанням сегментируются: — по регістру.
DS, якщо серед зазначених регистров-модификаторов немає регістру BP; - по регістру.
SS, якщо з модифікаторів — регістр BP. Отже, адреси виду A,.
A[BX], A[SI], A[DI], A[BX][SI] иA[BX][DI] сегментируются по регістру DS, а адреси.
A[BP], A[BP][SI] иA[BP][DI] - по регістру SS, тобто. адреси трьох останніх видів.
использу-ются для доступу до осередків стека. 3) У строковых командах STOS, MOVS,.
SCAS і CMPS, мають два опе-ранда-адреса, куди вказують індексні.
регістри SI і DI, один изоперандов (яку підказує SI) сегментируется по.
регістру DS, адругой (нею вказує DI) — по регістру ES. 1.4.4 Програмні.
сегменти. Директива ASSUME Розглянемо, як сегментування проявляється у програмах.
на MASM. Щоб вказати, що деяка група пропозицій программына.
MASM утворюють єдиний сегмент пам’яті, вони оформляються як программ-ный сегмент:
їх ставиться директива SEGMENT, після нього — дирек-тива ENDS, причому.
на початку обох цих директив має зазначене од-но і те ім'я, відіграватиме роль.
імені сегмента. А програма в целомпредставляет собою послідовність таких.
програмних сегментів, вконце якій вказується директива кінця програми.
END, наприклад: DT1 SEGMENT ;програмний сегмент безпосередньо з ім'ям DT1 A DB 0 B DW? DT1.
ENDS; DT2 SEGMENT ;програмний сегмент DT2 З DB «hello «DT2 ENDS; CODE SEGMENT.
;програмний сегмент CODE ASSUME CS: CODE, DS: DT1, ES: DT2 BEG: MOV AX, DT2 MOV.
DS, AX MOV BH, C … CODE ENDS END BEG ;кінець тексту програми Пропозиції програмного.
сегмента асемблер розміщає щодо одного сег-менте пам’яті (разом.
вони повинні займати більш 64Кб) начи-ная з найближчого вільного адреси, кратного.
16. Номер (перші 16 би-тов початкового адреси) цього сегмента стає.
значенням імені сег-мента. У MASM це належить до константним выражениям, а.
не адрес-ным, у зв’язку з ніж у команді MOV AX, DT2второй операнд є безпосереднім,.
у регістр AX будетзаписано початок (номер) сегмента DT2, а чи не.
вміст початковій ячейкиэтого сегмента. Імена ж змінних (A, B, З) і мітки.
(BEG) ставляться до адреснымвыражениям, і це ставлять у відповідність адресу їх.
осередки щодо «свого «сегмента: імені A відповідає адресу 0, імені B ;
адресу 1, имени З — адресу 0, а мітці BEG — адресу 0. Усі посилання пропозиції одного.
програмного сегмента ассемблерсегментирует за умовчанням за одним й інші.
ж сегментному регістру. Покакому саме — встановлюється спеціальної директивою.
ASSUME. У нашемпримере ця директива визначає, що це посилання сегмент CODE.
долж-ны, якщо року зазначений сегментний регістр, сегментуватися по регис-тру.
CS, все посилання DT1 — по регістру DS, проте посилання DT2 — порегистру ES.
Зустрівши з тексту програми посилання якесь ім'я (наприклад, наимя З у команді.
MOV AX, C), асемблер визначає, що не программномсегменте воно описано (у.
нашій DT2), потім інформації з директивыASSUME дізнається, який сегментний.
регістр поставлене відповідність этомусегменту (ми — це ES), і далі утворює.
адресну пару иэ данногорегистра і усунення імені (ми — ES:0), якою і.
записує в фор-мируемую машинну команду. У цьому асемблер враховує що використовується.
вПК угоду про сегментних регістрах за умовчанням: тоді як адресної па-ре,.
вибудуваної ним самим чи явно заданої у програмі, сегментний ре-гистр збігається.
з регістром за умовчанням, то машинну команду зано-сится лише усунення.
Якщо, скажімо, у нашій прикладі зустрінеться командаMOV CX, B, тоді з імені У асемблер
побудує пару DS:1, але якщо опе-ранд-адрес команди MOV за умовчанням сегментируется.
по регістру DS, тозаписывать цей регістр в машинну команду зайве.
і асемблер записы-вает у ній лише усунення 1. Отже, директива ASSUME.
рятує програмістів від необхо-димости виписувати повні адресні пари не.
тільки тоді ми, коли исполь-зуются сегментні регістри за умовчанням (як у.
безпосередньо з ім'ям B), нотогда, як у машинної команді потрібно було б явно вказати сегментныйрегистр
(як у безпосередньо з ім'ям З). У MASM сегментний регістр в ссылкена.
ім'я потрібно указувати лише тоді, коли ім'я має по каким-либопричинам сегментуватися.
по регістру, що відрізняється від цього, що постав-лен у відповідність всьому.
сегменту, у якому це описано. Однак це справедливе тільки за дотримання.
наступних усло-вий. По-перше, директива ASSUME повинна бути вказана перед.
першої ко-мандой програми. Інакше асемблер, просматривающий.
текстпрограммы згори донизу, нічого очікувати знати, як сегментувати імена з ко-манд,.
розташованих до цієї директиви, і тому зафіксує ошибку. Во-вторых, в директиві.
ASSUME слід кожному сегменту ставити в соот-ветствие сегментний регістр:
якщо ассемблеру зустрінеться посилання имяиз сегмента, якому відповідає.
ніякої сегментний регістр, тоон зафіксує помилку. Щоправда, в обох випадках.
можна запобігти ошибки, но при цьому засланні необхідно явно вказувати сегментний.
регістр. 1.4.5 Початкова завантаження сегментних регістрів Директива ASSUME повідомляє.
ассмеблеру у тому, за якими регістрам ондолжен сегментувати імена з яких.
сегментів, і «обіцяє «, що вэтих регістрах перебуватимуть початкові адреси.
цих сегментів. Одна-ко завантаження цих адрес в регістри сама директива не осуществляет.Сделать.
таку завантаження — обов’язок самої програми, з завантаження сег-ментных.
регістрів це має починатися виконання програми. Делаетсяэто так.
Бо у ПК немає команди пересилки безпосереднього операнда всегментный регістр
(а ім'я, тобто. початок, сегмента — це непосредствен-ный операнд), то таку завантаження.
доводиться робити через якийсь дру-гой, несегментный, регістр (наприклад,.
AX): MOV AX, DT1 ;AX:=начало сегмента DT1 MOV DS, AX ;DS:=AXАналогично завантажується.
реєстр ES. Завантажувати регістр CS на початку програми зайве: він, як і.
счетчиккоманд IP, завантажується операційній системою до того, як начинаетсявыполнение.
програми (інакше там було розпочати його виконання). Чтоже стосується.
регістру SS, використовуваного до роботи зі стеком, він мо-же бути завантажений так.
ж, як і регістри DS і ES, однак у MASM преду-смотрена можливість завантаження.
цього регістру ще до його виконання прог-раммы (див. 1.7). 1.4.6 Посилання вперед Зустрічаючи.
в символьній команді заслання тому — ім'я, яке описанов тексті програми.
до цієї команди, асемблер вже необходимуюинформацию про ім'я і тому може.
правильно оттранслировать цю ко-манду. Але тоді як команді зустрінеться посилання.
вперед, тобто. ім'я, котороене було описане до команди, і яке, напевно, буде.
описано позже, то асемблер здебільшого зможе правильно оттранслироватьэту.
команду. Наприклад, не знаючи, що не програмному сегменті будетописано.
це, асемблер неспроможна визначити, з якого сегментномурегистру треба сегментувати.
ім'я, і тому неспроможна визначити, надоїли немає розміщувати перед відповідної.
машинної командою префікс за-мены сегмента і, коли треба, то який.
саме. У ситуації асемблер діє так: якщо вкоманде.
зустрілася посилання вперед, він робить деяке предположе-ние щодо.
це ім'я вже з урахуванням цього припущення фор-мирует машинну команду.
Якщо потім (коли зустрінеться опис имени) окажется, що це припущення було.
неправильним, тоді асемблер пы-тается виправити сформированнную ним раніше машинну.
команду. Проте этоне вдається: якщо правильна машинна команда повинна.
заниматьбольше місця, ніж машинна команда, побудована з урахуванням предположе-ния.
(наприклад, команді треба насправді вставити префікс за-мены сегмента),.
тоді асемблер фіксує помилку (зазвичай, этоошибка номер 6: Phase.
error between passes.) Які ж припущення робить асемблер, зустрічаючи заслання.
вперед?Во всіх командах, крім команд переходу (про неї див. 1.5), ассемблерпредполагает,.
що ім'я буде описано у сегменті даних, і тому сегмен-тируется по регістру.
DS. Це треба враховувати під час упорядкування прог-раммы: тоді як команді зустрічається.
посилання вперед з ім'ям, яке описа-но у сегменті, початку якого.
вказує сегментний регістр, отлич-ный від DS, та над такою назвою автор програми.
повинен написати соот-вествующмй префікс. Приклад: code segment assume cs: code.
x dw? beg: mov ax, x ;тут замість cs: x можна записати просто x mov cs: y, ax.
;тут неодмінно треба записати cs: y … y dw? code ends 1.5. ПЕРЕХОДИ У систему.
команд ПК входить звичайний для ЕОМ набір команд перехода: безусловные і умовні.
переходи, переходи з поверненнями та інших. Проте вПК ці команди мають деякі.
особливості, що тут і рассматри-ваются. Абсолютний адресу команди, яка.
має бути виконане следующей, определяется парою CS: IP, тому виконання.
переходу означає измене-ние цих регістрів, обох або тільки одного (IP).
Якщо изменяетсятолько лічильник команд IP, такий перехід називається внутрисегментнымили.
близьким (управління залишається у тому сегменті команд), і якщо ме-няются.
обидва регістру CS і IP, це межсегментный чи далекий переход (начинают виконуватися.
команди з іншого сегмента команд). По способуизменения лічильника команд.
переходи діляться на абсолютні і относитель-ные. Якщо команді переходу зазначений.
адресу (усунення) тієї команди, ко-торой треба передати управління, це абсолютний.
перехід. Проте вкоманде то, можливо зазначена величина (зрушення), і треба.
додати ктекущему значенням регістру IP, щоб вийшов адресу переходу, і тогдаэто.
буде відносний перехід; у своїй зрушення то, можливо положитель-ным і.
негативним, отже можливий перехід уперед і тому. По вели-чине зсуву відносні.
переходи діляться на короткі (зрушення задаетсябайтом) і довгі (зрушення.
— слово). Абсолютні ж переходи діляться напрямые й опосередковані: з прямою переході.
адресу переходу поставив у са-мой команді, а при непрямому — у команді вказується.
регістр чи ячей-ка пам’яті, у якому (якої) перебуває адресу переходу.
1.5.1 Безумовні переходи. У MASM все команди безумовного переходу позначаються.
однаково: JMP opно залежно від типу операнда, асемблер формує.
різні машинныекоманды. 1) Внутрисегментный відносний короткий перехід. JMP.
i8 (IP:=IP+i8)Здесь i8 позначає безпосередній операнд розмірів в байт, которыйинтерпретируется.
як знакову ціле від -128 до 127. Команда прибавляетэто.
число до поточному значенням регістру IP, одержуючи у ньому адресу (смеще-ние) тієї команди,.
що має бути виконано наступній. Регістр CSпри цьому змінюється.
Необхідно враховувати таку особливість регістру IP. Выполнениелюбой команди.
починається сіло, що у IP заноситься адресу наступній заней команди, і лише для того.
виконується власне команда. Для коман-ды відносного переходу це,.
що операнд i8 прибавляетсяне до адресою цієї команди, а до адресою команди,.
наступній з ним, поэто-му, приміром, команда JMP 0 — це перехід для наступної.
команду про-граммы. Під час написання машинної програми зрушення для відносних.
перехо-дов доводиться вираховуватимуть вручну, проте MASM позбавляє цього не-приятного.
заняття: в MASM в командах відносного переходу всегдауказывается мітка.
тієї команди, яку треба передати управління, иассемблер сам обчислює.
зрушення, який і записує в машинну ко-манду. Звідси випливає, що у MASM.
команда переходу по мітці восприни-мается не як абсолютний перехід, бо як відносний.
По короткому переходу можна передати управління лише з ближай-шие.
команди програми — віддалені від команди, наступній за командойперехода, до 128.
байтів тому, чи до 127 байтів вперед. Для переходана більш віддалені команди.
використовується 2) Внутрисегментный відносний довгий перехід. JMP i16 (IP:=IP+i16)Здесь.
i16 позначає безпосередній операнд площею слово, кото-рый розглядається.
як знакову ціле від -32 768 до 32 767. Цей пере-ход аналогічний.
короткому переходу. Зазначимо, що, зустрівши команду переходу з міткою, якої був.
по-мечена одне з попередніх (за текстом) команд програми, асемблер вы-числяет.
різницю між адресою цієї мітки і адресою команди переходу ипо цьому зрушенню.
визначає, яку машинну команду відносного пе-рехода — коротку чи.
довгу — треба сформувати. Але якщо мітка ещене зустрічалася з тексту програми,.
тобто. робиться перехід вперед, тогдаассемблер, не знаючи ще адреси мітки, неспроможна.
визначити, яку именномашинную команду відносного переходу формувати,.
й тому він навсякий випадок вибирає команду довгого переходу. Однак це машиннаякоманда.
займає 3 байта, тоді як команда короткого переходу — 2байта,.
і якщо автор програми на MASM прагне економії пам’яті изнает заздалегідь, що.
перехід вперед буде близьку мітку, він долженсообщить звідси ассемблеру,.
щоб він сформував команду короткогоперехода. Таке вказівку робиться з допомогою.
оператора SHORT: JMP SHORT LДля переходів тому оператор SHORT непотрібен: вже.
знаючи адресу мітки, ас-семблер сам визначить вид команди відносного переходу.
3) Внутрисегментный абсолютний непрямий перехід. JMP r16 (IP:=[r]) чи JMP.
m16 (IP:=[m16])Здесь r16 позначає будь-який 16-битовый регістр загального призначення,.
а m16- адресу слова пам’яті. У цьому вся регістрі (слові пам’яті) повинен находитьсяадрес,.
за яким буде зроблено перехід. Наприклад, по командеJMP BX осушествляется.
перехід за адресою, що у регістрі BX. 4) Межсегментный абсолютний.
прямий перехід. JMP seg: ofs (CS:=seg, IP:=ofs)Здесь seg — початок (перші 16.
бітов початкового адреси) деякого сег-мента пам’яті, а ofs — усунення у тому.
сегменті. Кілька seg: ofs определя-ет абсолютний адресу, яким робиться перехід.
У MASM ця паравсегда задається конструкцією FAR PTR, яка «каже », чтонадо.
зробити перехід у зазначеній мітці, причому ця мітка — «далека », з іншого.
сегмента. Зазначимо, що асемблер сам визначає, який этосегмент, і саме підставляє.
в машинну команду його початок, тобто. seg. 5) Межсегментный абсолютний непрямий.
перехід. JMP m32 (CS:=[m32+2], IP:=[m32])Здесь під m32 розуміється адресу.
подвійного слова пам’яті, у якому нахо-дится пара seg: ofs, задающая абсолютний.
адресу, яким дана ко-манда має виконати перехід. Нагадаємо, що у ПК.
величини розміром вдвойное слово зберігаються у «перевернутому «вигляді, тому усунення.
ofs на-ходится у першому слові подвійного слова m32, а усунення seg — у второмслове.
(за адресою m32+2). Команди межсегментного переходу використовуються тоді,.
коли командыпрограммы розміщені над одному сегменті пам’яті, а кількох (напер-мір,.
команд так багато, що у сукупності вони займають більш 64Кб, т. е. більш.
максимальної величини сегмента пам’яті). При перехід з од-ного такого сегмента.
на другий потрібно змінювати як лічильник ко-манд IP, а й вміст регістру.
CS, завантажуючи за останній начальныйадрес другого сегмента. Таке одночасне.
зміна обох цих ре-гистров і роблять команди межсегментного переходу.
При запис у MASM команд переходу треба враховувати, що вони могутвосприниматься.
неоднозначно. Скажімо, як сприймати команду JMP Aяк по мітці.
A чи як за адресою, що зберігається вячейке безпосередньо з ім'ям A? З іншого боку, який.
це перехід — внутрисегментныйили межсегментный? Відповідь залежить від цього, як описано.
ім'я A, і зажадав від то-го, коли описано ім'я A — до чи ж після команди переходу. Нехай.
A описано до команди переходу («посилання тому »). Якщо именемA позначена деяка.
команда поточного сегмента команда (тобто. A — мет-ка), тоді асемблер формує.
машинну команду внутрисегментного от-носительного переходу. Якщо ж A ;
ім'я перемінної, тоді ассемблерформирует машинну команду непрямого переходу ;
внутрисегментного, если A описано в директиві DW, чи межсегментного, якщо A описано.
вдирективе DD. У разі, якщо ім'я A описано після команди переходу («ссылкавперед »),.
асемблер завжди формує машинну команду внутрисегментно-го відносного.
довгого переходу. З огляду на це ім'я A обязательнодолжно мітити команду.
з поточного сегмента команд, інакше буде зафик-сирована помилка. Якщо така.
трактування посилання вперед не удовлетворяетавтора програми, тоді й зобов’язаний з.
допомогою оператора SHORT чи PTRуточнить тип імені A: JMP SHORT A ;внутрисегментный.
короткий перехід по мітці JMP WORD PTR A ;внутрисегментный непрямий перехід.
JMP DWORD PTE A ;межсегментный непрямий перехід Зазначимо, що перехід по мітці.
A з іншого сегмента команд всегдадолжен указуватися з допомогою FAR PTR (незалежно.
від цього, описана мет-ка A до чи влітку після команди переходу): JMP FAR PTR A.
;межсегментный перехід по мітці 1.5.2 Умовні переходи. Практично в усіх командах.
умовного переходу перевіряється значе-ние тієї чи іншої прапора (наприклад,.
прапора нуля ZF) і, коли він имеетопределенное значення, виконується перехід за адресою,.
зазначеному в ко-манде. Значення прапора має бути встановлено попередньої.
командою, на-приклад, командою порівняння CMP op1, op2которая обчислює різницю.
op1-op2, проте результат куди записы-вает, лише змінює прапори, куди.
і реагуватиме командаусловного переходу. У MASM команди умовного переходу.
мають таку форму: Jxx opгде xx — одна чи кілька літер, скороченому.
вигляді відбивають прове-ряемое умова (зазвичай, у припущенні, і цієї.
командою нахо-дится команда порівняння). Приклади деяких мнемоник: JE — перехід.
" по одно «(jump if equal) JL — перехід «по менше «(jump if less) JNL — перехід.
" по неменше «(jump if not less) Особеностью всіх машинних команд умовного.
переходу є то, что вони реалізують внутрисегментный відносний короткий.
переход, т. е. додають до лічильника команд IP свій операнд, аналізований какзнаковое.
число від -128 до 127. У MASM цей операнд завжди повинен запи-сываться.
як мітка, яку асемблер замінить на відповідний сдвиг (см. вище). Така.
особливість команд умовного переходу викликає неудобствопри переходах на «далекі «.
команди. Наприклад, коли треба зробити пере-ход при A M (обхід команди JMP).
JMP L ;менше —> L (довгий перехід) M: … 1.5.3 Команди управління циклом.
У ПК кілька команд, спрощують програмування циклів сзаранее відомим.
числом повторень. Застосування цих команд требует, чтобы до початку циклу в регістр
CX було занесено число кроків циклу. Са-ми команди розміщуються наприкінці циклу,.
вони зменшують значення CX на 1и, якщо CX ще одно 0, передають управління.
початку циклу. Напер-мір, знайти P. S — суму елементів масиву X з десяти чисел-слов.
ж личить отак: MOV AX, 0 ;початкова значення суми (накопичується в AX) MOV SI, 0.
;початкова значення індексного регістру MOV CX, 10 ;число повторень циклу L: ADD.
AX, X[SI] ;AX:=AX+X[i] ADD SI, 2 ;SI:=SI+2 LOOP L ;CX:=CX-1; if CX0 then goto L.
MOV S, AX ;S:=AX Крім команди LOOP є ще «циклічні «команди — LOOPZ.
иLOOPNZ (вони теж мають синонимичные назви LOOPE і LOOPNE), яких кромерегистра.
CX перевіряють що й прапор нуля ZF; наприклад, команда LOOPZ «вы-ходит «з добірки,.
якщо CX=0 чи ZF=1. Цю команду можна, наприклад, ис-пользовать у пошуку в масиві.
першого нульового елемента, де должнобыть передбачено дві умови виходу.
з добірки: або перебуватиме знайдено ну-левой елемент (ZF=1, якщо перед LOOPZ поставити.
команду порівняння оче-редного елемента з 0), або перебуватиме вичерпаний весь мсассив.
(CX=0) Зазначимо, всі ці «циклічні «команди реалізують короткий от-носительный.
перехід, як і команди умовного переходу, тому їх мож-но використовувати.
лише циклів з гаком числом команд. У MASM є ще команди переходу.
— CALL (перехід із возвратом) и RET (повернення з підпрограми), вони розглядаються.
в 1.7. 1.6. СТРОКОВЫЕ ОПЕРАЦІЇ У ПК під рядком розуміється послідовність.
сусідніх байтів илислов. У зв’язку з цим все строковые команди мають чи два різновиди.
— до роботи зі рядками з байтів (в мнемоніку операцій входить літера.
B)и до роботи зі рядками з слів (в мнемоніку входить W). Є такі операції.
над рядками: — пересилання елементів рядків (на згадку про, з пам’яті, память-память);
— порівняння двох рядків; - перегляд рядки в пошуках елемента, рівного.
заданому. Кожна з операцій виконується лише над одним элементомстроки,.
проте одночасно відбувається автоматична настроювання наследующий чи.
попередній елемент рядки. Є спеціальні командыповторения (REP та інших.), які.
змушують таку по них строковуюкоманду багаторазово повторюватися (до.
216 раз), у зв’язку з якщо така па-ра команд дозволяє обробити всю рядок,.
причому значно швидше, чемзапрограммированный цикл. З іншого боку, рядки можна переглядати.
вперед (від своїх початку до кон-цу) і. Напрям перегляду залежить.
від прапора напрями DF, значение якого змінювати з допомогою команд STD.
(DF:=1) і CLD (DF:=0). При DF=0 всі наступні строковые команди програми просмат-ривают.
рядки вперед, а при DF=1 — тому. У строковых командах операнды явно.
не вказуються, а подразумева-ются. Якщо команда працює із однієї рядком, то.
адресу чергового, об-рабатываемого зараз елемента рядки задається парою регістрів.
DS і SIили парою ES і DI, і якщо команда працює із двома рядками, то адресэлемента.
а такою визначається парою DS: SI, а адресу елемента дру-гой ;
парою ES: DI. По виконанні операції значення регістру SIи/или DI збільшується.
(при DF=0) чи зменшується (при DF=1) на 1 (длябайтовых рядків) чи 2 (для.
рядків із слів). Початкова установка всіх таких регістрів, і навіть прапора DF должнабыть.
виконано на початок операції над рядком. Якщо сегментний регистрDS вже.
потрібне значення, тоді завантажити регістр SI з по-міццю команди LEA SI, Если.
ж суспільства потрібно завантажити відразу обидва регістру DS і SI, можна буде вос-пользоваться.
командою LDS SI, m32которая в регістр SI заносить перше слово, а регістр DS.
— второеслово з подвійного слова, має адреc m32 (в такий спосіб, по адресуm32+2.
повинен зберігатися сегмент, а, по адресою m32 — усунення начальногоили кінцевого.
елемента рядки). Початкову завантаження регістрів ES і DIобычно здійснюють однієї.
командою LES DI, m32которая діє аналогічно команді LDS. Перерахуємо коротенько.
строковые команди ПК. Команда завантаження елемента рядки у акумулятор (LODSB.
чи LODSW) пересылает в регістр AL чи AX черговий елемент рядки, на которыйуказывает.
пара DS: SI, після чого збільшує (при DF=0) чи уменьшает (при DF=1).
регістр SI на 1 чи 2. Команда записи акумулятора в рядок (STOSB чи STOSW).
заносить со-держимое регістру AL чи AX на той елемент рядки, який указываетпара.
ES:DI, після чого змінює регістр DI на 1 чи 2. Команда пересилки рядків.
(MOVSB чи MOVSW) зчитує елемент первойстроки, визначається парою DS: SI,.
в елемент другий рядки, определяе-мый парою ES: DI, після чого одночасно змінює.
регістри SI і DI. Команда порівняння рядків (CMPSB чи CMPSW) порівнює очередныеэлементы.
рядків, указываемые парами DS: SI і ES: DI, і результати сравне-ния (одно,.
менше (і т.п.) фіксує в прапорах, після чого змінює реги-стры SI і DI.
Команда сканування рядки (SCASB чи SCASW) порівнює элементстроки, адресу якого.
задається парою ES: DI, багатозначно регістру ALили AX і результати порівняння.
фіксує в прапорах, після чого змінює со-держимое регістру DI. Перед будь-який строковой.
командою можна поставити жодну з двох ко-манд, званих «префіксами.
повторення ", яка змусить многократноповториться цю строковую команду. Кількість.
повторень (зазвичай длинастроки) має зазначене в регістрі CX. Префікс.
повторення REPZ (синонимы — REPE, REP) спочатку заносить 1 в прапор нуля ZF, після.
чего, постоянно зменшуючи CX на 1, змушує повторюватися таку за нимстроковую.
команду до того часу, поки CX бракуватиме 0 або поки що прапор ZFне змінить своє.
значення на 0. Інший префікс повторення REPNZ (сино-ним — REPNE) діє аналогічно,.
але спочатку устанавливаетфлаг ZF в 0, а при за зміни його.
на 1 припиняє повторення стро-ковой команди. Приклад. Нехай треба переписати 10 000.
байтів починаючи з адреси A вдругое місце пам’яті починаючи з адреси B. Якщо обидва.
цих імені относятсяк сегменту даних, початку якого вказує регістр DS,.
тоді этупересылку можна зробити: CLD ;DF:=0 (перегляд рядки вперед) MOV.
CX, 1000 ;CX — число повторень MOV AX, DS MOV ES, AX ;ES:=DS LEA SI, A ;ES:SI — «звідки «.
LEA DI, B ;DS:DI — «куди «REP MOVSB ;пересилання CX байтів 1.7. СТІК. ПІДПРОГРАМИ.
1.7.1 Стік У ПК є спеціальні команди роботи з стеком, тобто. областьюпамяти,.
доступом до елементам якій здійснюється за принципом «послед-ним.
записано — першим лічений ". Але, щоб було воспользо-ваться цими.
командами, слід дотримуватися низки умов. Під стік можна відвести область.
будь-де пам’яті. Розмір її мо-же бути будь-яким, але з повинен перевершувати 64Кб,.
та її початковий адресдолжен бути кратним 16. Інакше кажучи, ця галузь повинна.
бути сег-ментом пам’яті; вона називається сегментом стека. Початок цього сегмента (первые.
16 бітов початкового адреси) має неодмінно зберігатися всегментном.
регістрі SS. Збережені в стеці елементи може мати будь-який розмір, проте следуетучитывать,.
що у ПК є команди запис у стік читання з неготолько слів.
Тож записи байта в стік їх треба предварительнорасширить до слова, а запис.
чи читання подвійних слів осуществляютсяпарой команд. У ПК прийнято заповнювати.
стік знизу вгору, від великих адрес кменьшим: перший елемент записується насамкінець.
області, відведеної подстек, другий елемент — в попередню осередок області.
тощо. Считываетсявсегда елемент, записаний у стік останнім. У зв’язку з цим.
нижняяграница стека завжди фіксована, а верхня — змінюється. Слово памяти, в якому.
перебуває елемент стека, записаний останнім, называетсявершиной стека.
Адреса вершини, відлічений з початку сегмента стека, обязан перебувати у покажчику.
стека — регістрі SP. Отже, аб-солютный адресу вершини стека визначається.
парою SS: SP. ——- ——- ——- SS: SP | | SS: SP | | SS: SP | | | ——- запис.
| ——- читання | ——- | | | =======> ——>| b | =======> | | | | ——- в стік.
——- з стека | ——- ——->| a | | a | ——>| a | ——- ——- ——- Значення.
0 в регістрі SP свідчить у тому, що стік полностьюзаполнен (його вершина.
" дійшла «на початок області стека). Тому дляконтроля за переповненням стека треба.
перед нової записом в стік прове-рять умова SP=0 (сам ПК цього робить).
Для порожнього стека значениеSP має рівнятися розміру стека, тобто. пара SS: SP.
повинна вказувати набайт, наступний за останнім байтом області стека. Контроль.
за чтениемиз порожнього стека, коли треба, зобов’язана робити сама програма. Початкова.
установка регістрів SS і SP то, можливо зроблена в са-мой програмі, проте.
в MASM передбачена можливість автоматическойзагрузки цих регістрів. Якщо.
директиві SEGMENT, початкуючою описаниесегмента стека, вказати параметр STACK,.
тоді асемблер (точніше, за-грузчик) до того, як передати управління на першу.
команду машиннойпрограммы, завантажить в регістри SS і SP потрібні значення. Наприклад,.
еслив програмі сегмент стека описаний так: ST SEGMENT STACK.
DB 256 DUP (?) ;розмір стека — 256 байтів ST ENDSи коли під цей сегмент було виділено.
область пам’яті починаючи з абсо-лютного адреси 12340h, тоді до початку виконання.
програми в регистреSS виявиться величина 1234h, а регістрі SP — величина.
100h (=256).Отметим, що це значення відповідають порожньому стеку. 1.7.2 Основні.
стековые команди За дотримання зазначених вимог щодо програми использоватькоманды,.
призначені до роботи зі стеком. Основні з них явля-ются.
такі. Запис слова в стік: PUSH opЗдесь op позначає будь-який 16-битовый.
регістр (зокрема і сегмент-ный) чи адресу слова пам’яті. З цієї команді значення.
регістру SPуменьшается на 2 (віднімання іде за рахунок модулю 216), після.
чегоуказанное операндом слово записується в cтек за адресою SS: SP. Читання слова.
з стека: POP opСлово, лічене з вершини стека, присвоюється операнду op.
(регист-ру, зокрема сегментному, але з CS, чи слову пам’яті), після чегозначение.
SP поповнюється 2. Перехід з поверненням: CALL opЭта команда записує.
адресу наступній з ним команди у стік і затемделает перехід за адресою, визначеного.
операндом op. Вона используетсядля переходів на підпрограми з запам’ятовуванням.
в стеці адреси повернення. Є такі різновиду цієї команди (вони аналогічні.
вари-антам команди безумовного переходу JMP): — внутрисегментный відносний.
довгий перехід (op — непосредст-венный операнд площею слово, а.
в MASM — це мітка з поточного сег-мента команд чи ім'я близькій процедури (див.
нижче)); у разі встек заноситься лише поточне значення лічильника команд IP,.
тобто. смеще-ние наступній команди; - внутрисегментный абсолютний непрямий перехід.
(op — адресу словапамяти, у якій перебуває адресу (усунення) тієї команди,.
яку ибудет зроблено перехід); й тут в стік записується лише усунення.
ад-реса повернення; - межсегментный абсолютний прямий перехід (op — непосредственныйоперанд.
виду seg: ofs, а MASM — це FAR PTR чи ім'я дальнейпроцедуры (див.
нижче)); тут у стік заноситься поточні значення регист-ров CS і IP (котра першою стік.
записується вміст CS), тобто. абсолют-ный адресу повернення, після чого змінюються.
регістри CS і IP; - межсегментный абсолютний непрямий перехід (op — адресу.
двойногослова, де знаходиться пара seg: ofs, задающая абсолютний адресу пе-рехода);
й тут в стеці рятується вміст регістрів CS і IP. Перехід (повернення).
за адресою з стека: RET opИз стека зчитується адреса київська і у ній виробляється.
перехід. Якщо указаноперанд (але це має бути ненегативне число), то після.
читання ад-реса стік ще очищається цього число байтів (до SP додається це.
чис-ло). Команда використовується для повернення з підпрограми за адресою, за-писанному.
в стік за командою CALL при виклик підпрограми, і одновре-менной очищення стека.
від параметрів, які основна програма занеслав стік перед зверненням до.
подпрограмме. Команда RET має чи два різновиди (хоча у MASM вони записываютсяи.
однаково): щодо одного випадку із стека зчитується лише одна словоусунення.
адреси повернення, тоді як у другому — з стека зчитується пара seg: ofs, яка вказує абсолютний.
адресу повернення. Як асемблер определяет, какой з цих двох випадків має.
місце, пояснено нижче. У ПК стік переважно використовується в організацію підпрограм.
ипрерываний. Підпрограми розглядаються нижче, а переривання — в главе3.
Проте, навіть якщо програмі непотрібен стік, вона однаково повинна от-вести під.
нього місце. Річ у тім, що стеком буде неявно пользоватьсяоперационная система.
при обробці переривань, які виникають (нап-ример, при натисканні клавіш.
на клавіатурі) тоді, коли выполняетсяпрограмма. Для потреб ОС рекомендується.
виділяти в стеці 64 байта. 1.7.3 Підпрограми Типова схема огранизации підпрограм,.
зазвичай використовувана транс-ляторами з мов високого рівня для реалізації.
процедур і державних функцій (вчастности, рекурсивних), наступна. При зверненні до.
подпрограмме в стік заносяться параметри нею иадрес возрата, після чого робиться.
перехід їхньому початок: PUSH param1 ;запис 1-го параметра в стік … PUSH paramk.
;запис останнього (k-го) параметра в стік CALL subr ;перехід у возратом.
на подпрограмму (Замечание: якщо потрібно обчислити параметр або якщо її розмір
от-личен від слова, для записи параметра в стік потрібно, звісно, нес-колько.
команд, а чи не одна.) Стан стека після виконання цих ко-манд звернення.
до подпрограмме показано на рис. a | | |———————| | | | лок. величины |0 ;
можливість перейти до sgn1 mov ax,-1 ;ax:=-1 sgn1: ret ;далекий повернення sign endp … Можливий.
приклад звернення до цій процедурі: ;cx:=sign (var) mov ax, var call sign ;далекий.
виклик mov cx, ax.