Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

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




Мікропроцесори Intel допускають різні способи адресації. Основним інструментом ініціалізації і зміни значення в регістрах і комірках пам'яті служить команда mov, що має наступний формат:

mov <destination, source>

де destination - приймач даних; source - джерело даних.

Як приймач і джерела можуть виступати регістри МП (reg) і комірки ОЗП (mеm). Припустимі комбінації:

mov reg, reg;

mov reg, [mem];

mov [mem], reg.

Комбінація mov [mem], [mem] заборонена.

Якщо операнд - це дані в пам'яті, адресу цих даних (також будь-якого числового вираження, але воно може містити регістри) повинний бути укладений у квадратні дужки або випереджений оператором “ptr”.

Наприклад:

- інструкція “mov еах,3” помістить число 3 у регістр еах;

- інструкція “mov еах,[7]” помістить 32-бітне значення з адреси 7 в еах;

- інструкція “mov byte [7],3” помістить число 3 у байт за адресою 7, це можна записати ще так: “mov byte ptr 7,3”.

Для того, щоб установити, який сегментний регістр буде використовуватися для адресації, потрібно поставити його назву з двокрапкою перед адресою усередині квадратних дужок або після оператора “ptr” (таблиця 3).

Обмін умісту комірки пам'яті або регістра з регістром:

xchg <destination, source>

Міняє місцями значення джерела і приймача. Якщо призначення - регістр, те джерело - регістр або значення пам'яті. Якщо призначення - значення пам'яті, те джерело - регістр.

3.1.1 Опис даних. Дані в пам'яті зберігаються побайтно, адресою змінної буде адреса самого молодшого її байта, т. зв. зворотний порядок або little indian. У програмі під дані необхідно визначити сегмент даних.

Щоб описати дані або зарезервувати для них місце в пам'яті, використовуйте одну з директив, перерахованих у таблиці 3. За директивою опису даних повинне іти одне або кілька числових значень, розділених комами. Ці вирази визначають значення для найпростіших елементів даних, розмір яких залежить від того, яка директива використовується. Наприклад, db 1,2,3 описує три байти зі значеннями 1, 2 і 3 відповідно.

Таблиця 3. Синтаксис директиви визначення даних

Розмір, байт Модифікатор Визначення даних Резервування даних
  byte db, file rb
  word dw, du rw
  dword dd rd
  fword, pword dp, df rp, rf
  qword dq rq
  tbyte, word dt rt
  dqword    

 

Директиви du і db описують рядки будь-якої довжини, укладені в лапки, що будуть конвертовані в послідовність байтів, якщо використано директиву db, або в послідовність слів з нульовим верхнім байтом, якщо використано директиву du.

Наприклад,

db ’abc’ визначає три байти зі значеннями 61, 62 і 63,

db ’1,2,3’ визначає масив із трьох байт зі значеннями 1, 2 і 3.

Директива dp або її синонім df допускають, щоб значення складалися з двох числових виразів, розділених двокрапкою, де перше значення - це верхнє слово, а друге - це нижнє подвійне слово значення далекого вказівника. Директива dd допускає такі покажчики, що складаються з двох слів, розділених двокрапкою, і dt допускає слово і четверне слово, розділені двокрапкою, четверне слово запам'ятовується першим. Директива dt з одним параметром допускає тільки значення з крапкою, що плаває, і створює дані в FPU-форматі подвійної розширеної точності.

Усі перераховані вище директиви підтримують використання спеціального оператора dup для створення копій даних значень. Кількість дублікатів повинна стояти перед цим оператором, а їхнє значення повинне стояти після - це може бути навіть ланцюжок значень, розділених комами, але цей ланцюжок повинний бути укладений у дужки, наприклад, db 5 dup (1,2) визначає п'ять копій даної послідовності з двох байтів.

file - це спеціальна директива і її синтаксис може бути різним. Ця директива включає ланцюг байтів з файлу. Як параметр за нею повинно йти в лапках ім'я файлу, далі, опціонально, двокрапка і числовий вираз, що вказує початок ланцюжка байтів, далі, також опціонально, кома і числовий вираз, що визначає кількість байтів у цьому ланцюжку (якщо цей параметр не визначений, то будуть включені всі дані до кінця файлу). Наприклад, file ’data. bin’ уключить весь файл як двійкові дані, a file ’data. bin’: 10h,4 уключить тільки чотири байти, починаючи зі зсуву 10h.

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

Усі директиви опису даних також підтримують значення “?", що виходить, що цій комірці не повинне бути привласнене якесь значення. Ефект від цієї директиви такий же, як від директиви резервування даних. Неініціалізовані дані не можуть бути включені у файл виводу, і, таким чином, їхні значення завжди будуть вважатися невідомими.

3.1.2 Константи. У числових виразах замість чисел ви також можете використовувати константи і мітки. Константа може бути перевизначена багато разів, але в цьому випадку вона буде доступна тільки після присвоєння значення і завжди буде дорівнює значенню з останнього визначення перед місцем, у якому вона використана.

Визначення константи складається з імені константи, знака “=” і числового виразу, що після обчислення стає значенням константи. Це значення завжди обчислюється в той же час, що і визначення константи.

Наприклад, за допомогою директиви count =17 ви можете визначити константу count і після використовувати неї в інструкціях асемблера, таких як mov cx, count - яка перетвориться в mov cx,17 під час процесу компіляції.

3.1.3 Мітки. Існують різні способи визначення міток. Найпростіший з них - двокрапка після назви мітки. За цією директивою на тім же рядку навіть може іти інша інструкція. Вона визначає мітку, значення якої дорівнює зсувові точки, у якій вона визначена. Цей метод звичайно використовується, щоб позначити місця в коді. Наприклад, start:, endloop:.

Інший спосіб - це проходження за ім'ям мітки (без двокрапки) якої-небудь директиви опису даних. Мітці привласнюється значення адреси початку визначених у директиві даних і запам'ятовується компілятором як мітка для даних з розміром комірки. Наприклад, bigdata dd 32.

Самий гнучкий спосіб завдання міток - це використання директиви label. За цією директивою повинне іти ім'я влучні, далі, опціонально, розмір оператора (може випереджатися двокрапкою), і далі, також опціонально, оператор at і числовий вираз, що визначає адресу, на який дана мітка повинна посилатися.

Наприклад, label wchar word at char, визначає нову мітку для 16-бітних даних за адресою char. Тепер інструкція mov ах,[wchar] після компіляції буде виглядати так само, як mov ax, word [char]. Якщо адреса не зазначена, директива label буде посилатися на поточну адресу. Таким чином, mov [wchar],57568 скопіює два байти, тоді як mov [char],224 скопіює один байт на ту ж адресу.

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

Мітки, що починаються з двох точок (..) – виключення, вони мають властивості глобальних, але не створюють новий префікс для локальних міток.

@@ позначає анонімну мітку, ви можете визначити її безліч разів. Символ @b (або еквівалент @r) посилається на найближчу попередню анонімну мітку, а символ @f посилається на найближчу після неї анонімну мітку. Ці спеціальні символи нечуттєві до регістра.

3.1.3 Операції зі стеком:

push <source> зменшує значення покажчика стекового фрейму (регістр ESP), потім копіює значення <source> у вершину стека. Операндом може бути пам'ять, регістр загального призначення, сегментний регістр або безпосереднє значення розміром у слово або подвійне слово. Якщо операнд - це безпосереднє значення і його розмір не визначений, то в 16-бітному режимі за замовчуванням він обробляється як слово, а в 32-бітному режимі як подвійне слово. Мнемоніки pushw і pushd - це варіанти цієї інструкції, що зберігають відповідно слова і подвійні слова. Допускається в одному рядку кілька операндів (розділених пробілами, а не комами).

pusha зберігає в стек уміст восьми регістрів загального призначення. У неї немає операндів. Існує дві версії цієї інструкції: 16-бітна і 32-бітна. Асемблер автоматично генерує версію, що відповідає поточному режимові, але, використовуючи мнемоніки pushaw або pushad, це можна змінити для того, щоб завжди одержувати, відповідно, 16- або 32-бітну версію. 16-бітна версія цієї інструкції зберігає регістри загального призначення в такому порядку: АХ, СХ, DX, ВХ, значення регістра SP перед тим, як був збережений АХ, далі ВР, SI і DI. 32-бітна версія зберігає еквівалентні 32-бітні регістри в тім же порядку.

pop <destination> - переводить слово або подвійне слово з поточної верхівки стека в операнд-адресат і після зменшує значення ESP на відповідне значення (2 або 4 байти). Операндом може служити пам'ять, регістр загального призначення або сегментний регістр. Мнемоніки popw і popd - це варіанти цієї інструкції, що відновлюють відповідно слова і подвійних слів. Якщо в одному рядку утримується трохи операндів, розділених пробілами, компілятор асемблює ланцюжок інструкцій з цими операндами.

popa відновлює регістри, збережені в стек інструкцією pusha, крім збереженого значення SP (або ESP), що буде зігнорований. У цієї інструкції немає операндів. Щоб асемблювати 16 або 32-бітну версію цієї інструкції, використовуйте мнемоніки “popaw” або “popad”

Поделиться:





Читайте также:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...