![]() | Ім'я файлу: лаба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 |