Привіт і ласкаво просимо назад.
У цій новій лекції ми вивчимо інструкцію LEA.
LEA розшифровується як Load Effective Address (ефективна адреса завантаження).
Чим же займається LEA?
LEA виконує обчислення всередині квадратних дужок, не звертаючись до пам'яті і не змінюючи прапорів.
Приклад:
LEA -, дужка - плюс чотири.
Вищеописана команда додає чотири до адреси в - і зберігає нову адресу в -.
Зауважте, що дужки тут не означають скасування посилань.
Тобто він не звертається до значення, що зберігається за адресою в - плюс чотири.
Інший приклад:
MOV -, - плюс чотири в дужках.
У вищенаведеному MOV дужки означають розіменування.
Тобто він звертається до значення, що зберігається за адресою пам'яті - плюс чотири, і копіює його в -.
У цьому полягає різниця між MOV і LEA.
Синтаксис.
Синтаксис команди - LEA, за яким слідує ім'я реєстру, а потім арифметичний вираз
у квадратних дужках.
Приклади:-.
- плюс чотири в дужках, або навіть трохи
складніше: LEA-,-, - плюс -
помножити на чотири.
Отже - тут може приймати значення цілих чисел або адрес. Якщо ви хочете використовувати його як простий спосіб виконання простих
арифметичних дій, то ваші значення, що зберігаються в -, будуть цілими числами, наприклад, 2 або 3, або будь-якими
іншими.
Або ви можете використовувати - для зберігання адрес для обчислення наступної адреси в масиві.
Таким чином, ви можете використовувати LEA для простих арифметичних або адресних обчислень.
Тож давайте зараз відкриємо наш і спробуємо розглянути деякі практичні приклади МЕР у дії.
Ми завантажимо наш шаблон один, як зазвичай.
А тепер перейдемо до нашого вкладу.
Щоб продемонструвати використання LEA як простого калькулятора, припустимо, що нам потрібно обчислити деяку цілочисельну
арифметику.
Тож ми перенесемо щось у -.
Отже, припустимо, що ми помістили інструкцію
MOV, -, один.
І тепер ми хочемо порахувати,
ми хочемо порахувати, скільки буде один плюс чотири.
Тож ми можемо зробити це ось так.
ЛЕА.
Збережемо результат обчислення в -, а потім виконаємо один плюс чотири
так: - плюс чотири.
Ось так.
Отже, в цьому простому прикладі ми перемістимо одиницю на -.
Давайте запустимо і подивимося.
Тож тут у нас пауза.
А тепер ми переступаємо.
Пересуваємо одиницю до -, і тепер - має одиницю.
Припустимо, ми хочемо зробити простий розрахунок.
Що таке один плюс чотири і зберігати результат в -?
Тож ми можемо зробити це таким чином.
Ми можемо скористатися інструкцією, а в дужках зробимо свій
розрахунок: - плюс чотири.
Отже - плюс чотири повинно бути п'ять, і тоді п'ять буде зберігатися в -.
Тож давайте зробимо крок і подивимось, як це відбувається.
А тепер - має п'ять.
Тепер, мало того, ми також можемо виконати дещо більш складні розрахунки, подібні до цього.
Гаразд, давайте спробуємо і подивимося, що з цього вийде.
LEA, LEA -, а в дужках ми робимо такий розрахунок: - плюс - помножити на чотири: - плюс -, помножити на чотири.
Як ви
думаєте, що це дасть?
Ми знаємо, що - має значення 1.
Він зробить множення, тому що це множення, як ви знаєте, має вищий пріоритет.
Отже, він спочатку виконає множення, і отримає це невідоме значення.
Надамо йому деяке відоме значення.
Двічі клацніть на цьому і поставте одиницю в -.
Тож тепер у нього є один.
Отже, тепер він візьме одиницю, помножить її на чотири, що дасть вам чотири, і ви візьмете
цю четвірку, додасте до -.
- один.
Отже, чотири плюс один дасть вам п'ять, а п'ять буде зберігатися в -, що вже дорівнює п'яти.
Гаразд, давайте змінимо інше число.
Давай змінимо це на два.
Гаразд.
Тепер - має значення два, тому два рази по чотири буде вісім. Вісім плюс один - дев'ять.
Отже, дев'ять зберігатиметься в -, тому дев'ять зберігатиметься тут.
Тож давайте подивимося. Підійдіть, і ви побачите - у нього дев'ять.
Отже, якщо ви використовуєте його таким чином, ви просто використовуєте його як простий спосіб виконати деякі швидкі, прості арифметичні
обчислення.
І добре те, що це не впливає на прапори.
Наші прапорці недоторкані порівняно з інструкцією INC, або SUB, або всіма іншими арифметичними
інструкціями.
Це вплине на прапори.
Але коли ви використовуєте LEA для таких простих обчислень, як це, прапорці залишаються недоторканими.
На них це ніяк не впливає.
Крім використання як простого калькулятора, ви також можете використовувати LEA для обчислення адрес.
Гаразд, давайте спочатку збережемо це, а потім знову відкриємо.
Тож давайте спочатку збережемо це: патч, а потім назвемо його 53.
53.
Тоді просто назвемо це просто
LEA dot XE.
Гаразд.
Натискаємо "Зберегти".
Тепер відкриваємо новий файл.
Тепер ми відкриємо новий файл, який щойно створили.
Все просто.
Цього разу ми використаємо цей LEA для обчислення адрес.
Отже, перед цим, давайте поставимо тут точку зупинки.
А тепер ми збережемо щось у -, адресу деякої адреси у пам'яті.
Гаразд, скажімо, ми введемо сюди адресу, адресу. Переходимо до карти пам'яті, даних, а потім прокручуємо і шукаємо адресу
пам'яті, яку хочемо скопіювати.
Скажімо, це адреса пам'яті.
Отже, ми копіюємо цю адресу.
Тепер ми повертаємося до нашого тут і змінюємо цю інструкцію на MOV, MOV за такою адресою.
Гаразд.
Отже, тепер ви бачите, що - зараз зберігає адресу даних, одну з адрес сегмента даних.
Тож тепер ми хочемо зберегти це в -.
Тож давайте зробимо це зараз і переступимо через нього.
Отже, зараз він перемістить цю адресу в -, а потім обчислить чотири
байти від -.
Це означає, що ви візьмете адресу -, тобто 403040, і додасте до неї D.
Чотири байти - це DWORD, пам'ятаєте?
І що ж ви отримаєте?
Тож давайте переступимо через це, а потім ви подивитесь -, отже, воно зайняло - і додайте до нього чотири.
Отже, ви повинні отримати 403044.
І ви бачите, що тепер має значення 403044.
1201234.
Ось,
403044.
Тож він додає одне слово, і ви потрапляєте сюди, отримуєте цю нову адресу.
Тож це хороший спосіб переміщатися по масиву.
Якщо ви використовуєте це як метод доступу до масивів, то ви будете робити так.
А ось ще один більш складний приклад, де ви використовуєте -.
Тож у цьому випадку ми можемо використовувати його як простий лічильник. Наприклад, ми можемо поставити його сюди.
Припустимо, ми змінимо це значення. Ми ставимо два, скажімо, два.
Тепер, коли ми запускаємо цю інструкцію, вона візьме це значення два, помножить на чотири,
отримає вісім, і додасть вісім до -.
Отже, коли ви додаєте вісім, то бачите, що тут треба додати перший, другий і
третій. Тобі варто відповісти.
Це означає, що ви переходите до двох слів, одиниці, нуля до слів, і приходите до цього третього слова тут.
Гаразд.
Тож давайте зробимо крок і подивимось, як це відбувається.
Гаразд, тепер подивіться, що в -.
Він має адресу
403048.
І це вказує на цю адресу.
Отже, це зручний спосіб використання LEA для доступу до масиву, елементів у масиві.
Отже, підводячи підсумок, ми бачимо, що можемо використовувати LEA для простих арифметичних
обчислень, або ж для обчислення адрес наступних елементів у масиві.
Отже, у вас є, скажімо, ваша базова адреса 403040.
Отже, базова адреса зазвичай призначається регістру -.
І після цього ви можете використовувати різні способи перебору кожного елемента масиву.
Або ви додаєте його ось так, плюс чотири кожного разу.
Отже, ви плюс чотири, ви отримуєте це. Ви плюс вісім, ви отримуєте цей і так далі.
Як варіант, ви можете використовувати - як лічильник, чи не так?
Отже, в наступних уроках я покажу вам більше прикладів того, як використовувати для доступу
до масивів пам'яті.
Тоді до зустрічі.
Дякуємо за перегляд.