Ім'я файлу: лаба4.docx
Розширення: docx
Розмір: 19кб.
Дата: 05.04.2021
скачати
Пов'язані файли:
Грошова реформа.docx

Лістинг 1. Взаємодія з пам'яттю комп'ютера

директива .data вказує процесору, що слідом за нею йдуть дані - числа, символи

Директива BYTE задає байт пам'яті

директива WORD - слово (два байта йдуть підряд)

директива DWORD - подвійне слово, або чотири байти.

Запис data_8 BYTE -3d означає, що в області пам'яті під ім'ям data_8 зберігається байт -3.

Запис data_16 defines word ? виділяє пам'ять для двох байтів (слова), знак питання показує, що значення байтів заздалегідь не визначено

Інструкція mov al, data_8 бере з пам'яті байт, позначений як data_8, і записує його вміст у регістр al.

Інструкція sub ah, ah посилає різниця ah - ah в регістр ah. Яким би не був вміст ah, там після такої операції виявиться 0.

інструкція dec ah зменшує вміст ah на одиницю

Інструкція dec, що обертає всі біти ah в одиницю, розширює знак числа -3, який потрапив в аl.

Після неї число -3 переселяється в регістр ах, звідки пересилається інструкцією mov data_16, ах в область пам'яті data_16, що складається з двох байтів.

Висновок: У лівому верхньому кутку видно адреси пам'яті, що зберігає команди процесора. Перша інструкція розташовується в пам'яті, починаючи з адреси 00401000 і займає п'ять байт. Друга інструкція sub ah, ah уміщається в двох байтах з адресами 00401005, 00401006 та т. д. Байт data_8, має адресу 00403000 і зберігає число -3 або в шістнадцятковому вигляді.

Наступні два байта помічені в лістингу словом dаtа_16 і повинні зберігати FFFD - число -3, записане в додатковому коді. Але відладчик показує, що першим йде байт FD (його адреса 00403001)), а слідом уже байт FF (його адреса 00403002). Так відбувається тому, що в процесорах Intel числа розташовуються в пам'яті за правилом: молодший байт має менший адресу.

Лістинг 2. Регістри міняються вмістом через стек

команда push eax посилає в стек вміст регістра eax.

команда push есх зберігає в стеку регістр есх, тобто число 3.

Команда pop eax виштовхує з стека число, поміщене туди останньою командою push. У нашому випадку це число 3. Значить, після команди pop eax в регістрі eax з'явиться число 3 - точно таке ж, як в регістрі есх. Але це рівність збережеться недовго.

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

Лістинг 3. Спроба регістрів ах і есх обмінятися вмістом

У правому нижньому вікні відладчика видно стан стека. Сірою смугою виділена вершина стека, тобто ті байти, які першими будуть забрані з стека командою pop. У вершини стека є адреса, який процесор зберігає в регістрі esp. У правому верхньому вікні видно, що esp містить число 0018FF94. Це ж число виділено сірим кольором у правому нижньому вікні. Залишається тільки зрозуміти, адреса якого байта зберігає esp. стек росте в сторону зменшення адрес. після команди push ах в стек додається два байта, в той час як адреса вершини зменшується на два і стає рівним 0012ffc2. Регістр ах, рівний 2211, поміщається в стек так, що старший байт 22 має старший адрес - як і належить процесорам Intel.

Наступна команда push есх має справу з 4-байтовий регістром, тому вершина стека зменшується на 4 і стає рівною 0012ffbe. Сам же регістр есх вивертається в стеці навиворіт за правилом: чим старше байт, тим старша адреса. Щоб відновити значення ах і есх, потрібні такі команди процесора:

mov ах, [esp-2]

mov ecx, [esp-6]

Виконуючи першу з них, процесор звернеться до пам'яті, адреса якої на 2 менше записаного в регістрі esp, візьме звідти два байта (їх адреси будуть рівні esp-2 і esp-1) і запише їх у регістр ах. Друга команда виконається аналогічно, тільки число байтів і адреса будуть іншими.

Листинг 4. Приклад непрямої адресації

непряма адресація не змінює вміст регістру, що зберігає адресу пам'яті. Після виконання інструкції mov есх, [esp-6] вміст esp залишиться колишнім.

Лістинг 5. Процедура AddDigs

Щоб в імені процедури AddDigs розрізнялися малі та великі літери, програма використовує директиву option casemap:none,

Процедура викликається інструкцією call <ім'я> (в нашому випадку це call AddDigs). Потім виконуються інструкції, складові її тіла, а далі процесор переходить до інструкції, безпосередньо за викликом call <ім'я процедури>.

Команда call запам'ятовує в стеку адресу повернення і завантажує в eip адресу першої інструкції процедури.

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

Лістинг 6. Передача параметрів через стек

Команда push DWORD PTR 2 записує в стек подвійне слово (4 байт), що містить число 2
скачати

© Усі права захищені
написати до нас