Термінова допомога студентам
Дипломи, курсові, реферати, контрольні...

Мова макроассемблера 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.

Показати весь текст
Заповнити форму поточною роботою