Привіт і ласкаво просимо назад.
У цьому уроці ми розглянемо MOVS. MOVS-MOVS розшифровується
як Move String, копіювання рядка
в рядок.
Це єдина команда, яка може одночасно звертатися до пам'яті, причому до двох різних пам'ятей,
пам'яті-джерела
і пам'яті-приймача, і може копіювати рядок з пам'яті-джерела в пам'ять-приймач.
Існує три варіанти команд MOVS: байт MOVS, слово MOVS
і слово MOVS
dword. MOVS B, MOVS
W і MOVS D.
MOVS
B зберігає байт з регістра - в регістр -, і ось як це виглядає.
Є адреса в -, і у вас також є адреса в -.
Отже, MOVS B копіює байт з --to register-адреси в -register в адресу в -register.
Після цього і -, і - адреси збільшуються на один байт.
РУШУЄТЬСЯ
В. MOVS
W зберігає слово з регістру - в регістр -.
Отже, він копіює слово, яке складається з двох байтів, з адреси в - на адресу в -.
Після цього - та - адреси збільшуються на два байти.
РУШУЄ Д.
MOVS D
зберігає подвійне слово з - в регістр -.
Таким чином, вона копіює слово dword, яке складається з чотирьох байт, з адреси in - в адресу in -.
Після цього обидві - та - адреси збільшуються на чотири байти або на ціле слово.
Після кожної операції - регістр і - регістр автоматично збільшуються або зменшуються залежно від
прапорця напрямку у регістрі прапорів.
Тепер давайте розглянемо практичний приклад MOVS.
Отже, ось програма, яка може копіювати рядки з одного регістру в інший.
Він копіює - в -, і ми можемо використовувати MOVS B всередині циклу, щоб досягти цього.
Отже, перший рядок копіює-переміщує адресу, цю адресу, в -.
Потім за цією адресою зберігається рядок, який ви збираєтеся скопіювати пізніше.
А друга інструкція копіює цю адресу, яка є адресою призначення, в регістр -.
Отже, мета полягає в тому, щоб скопіювати рядок за цією адресою у рядок за цією адресою, а цей - у рядок за цією адресою.
Далі припустимо, що у нас є рядок з п'яти символів.
Отже, ми переносимо 5 в -, і - буде лічильником.
Він зберігає довжину рядка в -.
Потім ми виконаємо інструкцію MOVS B.
І тепер ми опинилися всередині петлі.
Отже, команда MOVS B копіює байт з комірки пам'яті від - до -.
Після цього ви зменшуєте - register.
Отже - це 5.
Коли ви зменшуєте його, воно стає 4.
Потім ви виконуєте тест, стрибаєте не рівно.
Буде чи ні - нуль.
Якщо - не дорівнює нулю, це означає, що прапорець it-zero
дорівнює нулю, що означає, що - не дорівнює нулю.
Потім він повернеться назад і повторить цикл.
Отже, він перейде на цю адресу і знову перемістить B.
Отже, оскільки регістр - і регістр - просунулися на один байт, тепер ви копіюєте другий
байт рядка, а потім зменшуєте його на один байт.
Отже, ви переміщуєте - копіюєте другу частину рядка з - на -, який також є другим байтом,
а потім зменшуєте -.
- тепер стає 4, - тепер стає 3.
Потім ви перевіряєте, чи дорівнює воно нулю.
Оскільки воно не дорівнює нулю, то знову повертається до нуля.
Так ми продовжуємо повторювати цей цикл, поки він не стане нульовим.
Отже, коли це станеться, стрибок "не рівний" зазнає невдачі, і він вийде з циклу.
Спробуємо зробити це всередині x64dbg.
Я хочу, щоб ви відкрили свій x64dbg і ввели всі ці інструкції.
Отже, я вже зробив це тут,
і збережіть це як файл з назвою 62_movs. exe, і я закликаю вас зробити те саме.
Тепер ця адреса тут, 00403050.
Я отримав його, перейшовши на карту пам'яті, двічі клацнувши на сегменті даних, а потім вибравши порожнє
місце, яке для мене є цією адресою, і це може бути інша адреса для вашого випадку, тому ви просто змінюєте її відповідно
до вашого комп'ютера.
Отже, я копіюю цю адресу сюди в -, а потім помічаю, що я вже ініціалізував рядок у цьому
місці.
Я зробив це, клацнувши правою кнопкою миші тут, перейшовши до бінарного редагування, а потім ввів свій рядок,
п'ятисимвольний рядок, APPLE.
Потім я натискаю на "ОК".
Потім після нього - потім він записує ASCII-код у це місце, APPLE.
Далі мені потрібно мати адресу призначення, тому я обираю наступне місце, яке знаходиться тут, і переміщаю
його на -.
Тоді я переміщу 5 на -.
Тож давайте запустимо його зараз.
Спочатку поставте тут точку зупинки і виконуйте програму, доки вона не досягне точки зупинки і не переступить через неї.
Тепер ви переступаєте і переносите це на -.
- тепер має вашу вихідну адресу, яка містить рядок APPLE, що знаходиться тут.
А потім ви перемістите цю адресу 00403060, адресу призначення, в -.
Давайте переступимо
через це, і тепер - маємо адресу призначення.
Тепер ви пересуваєте 5, робите 2 кроки, і тепер 5 на "-". Чому п'ять? Тому що цей рядок, APPLE, складається
з п'яти символів.
Тепер ми викличемо команду MOVS B, яка перемістить один символ з цього - в - сюди.
Тож подивимося, як це станеться.
Відійди.
А тепер - було - перший символ було скопійовано в -, і ви побачите тут A. Після цього він також збільшує кількість.
Вона також збільшує адресу на одиницю.
Отже, - тепер перемістився вперед на один байт, так само як і -.
Зараз він вказує на 51, що знаходиться тут. Наведіть мишку, і ви побачите ось тут.
5-51
тут.
00403051. Якщо ви наведете мишку сюди, то
побачите це: 00403061, що збігається з цим.
Таким чином, обидва будуть просунуті вперед на один байт.
Тепер він зменшується на -.
- тепер має стати
- має стати 4.
Переступаємо через
неї, і тепер бачимо, що це 4.
Тепер він перевіряє, чи - дорівнює нулю. Оскільки - не нуль, він переходить на цю адресу,
00401542, яка знаходиться тут.
Тож давай переступимо.
І він стрибає назад, і тепер він збирається перемістити ще один байт, який
є другим символом -, у другий байт -.
Отже, ми переступаємо через нього і бачимо, що P було скопійовано, а також вказівник перемістився ще на один байт вперед.
Отже - зараз вказує на 3052, а тепер -
перемістилося на 00403052, що має бути тут, а потім
- також перемістилося вперед, 00403062, що має бути тут.
Це 012, гаразд.
Отже, тепер декремент - це наступний крок, який зменшується на одиницю.
Він стає 3, і стрибок не буде рівним, оскільки він не дорівнює нулю.
Тож ми йдемо за ним - переступаємо,
і він піднімається назад.
Переступайте, тепер
вона переміщує третю літеру, яка знову є P, туди.
Потім зменшити - на одиницю.
- тепер стає 2.
І це не нуль, тож він знову
підскочить і повториться.
Тепер він переміщує L у -.
L тут.
L тут, а потім
переступайте.
Зменшення - на одиницю.
- тепер дорівнює 1. Стрибок не буде
рівним, тому що це не нуль.
Тож він знову піднімається вгору.
Відійди. Тепер він копіює останній символ, E, в -, а потім зменшує - на одиницю.
- дорівнює нулю, тому
тепер стрибок не дорівнює
false, тому він завершиться.
Він вистрибує з циклу.
Ось як ми можемо використовувати інструкцію MOVS всередині циклу для копіювання одного рядка з однієї комірки
в іншу в пам'яті.
На цьому відео все.
Дякуємо за перегляд.