Привіт і ласкаво просимо назад.
У цій лекції ми дізнаємося про розширення знаків.
Постановка задачі:
Якщо ми маємо від'ємне число у регістрі -, який складається з восьми біт, як його розширити, щоб він став
регістром -, який складається з 16 біт?
Розглянемо приклад.
Розглянемо число п'ять, в даному випадку,
яке представляється в двійковому вигляді як це число, а це вісім біт.
Якщо ми хочемо розширити його до 16 біт, ми просто додаємо ці нулі, щоб розширити його до 16 біт.
Це називається розширенням знака.
Це додатне число завдяки цьому біту, який вказує на те, що це додатне число.
Тож ми просто додаємо нулі.
Тепер візьмемо інший приклад.
Приклад другий: продовження від'ємного числа.
Отже, п'ять представлено цим бінарним представленням.
Від'ємне число п'ять представляється цим числом у вигляді доповнення до двійки.
Отже, як нам продовжити цю від'ємну п'ятірку?
Тож, щоб продовжити цю від'ємну п'ятірку, ми додаємо ці одиниці ззаду, щоб продовжити її.
Отже, це приклад розширення знаку для від'ємного числа.
Підказки:
Якщо ми хочемо збільшити додатне число, ми додаємо нулі.
З іншого боку, якщо ми хочемо збільшити від'ємне число, ми додаємо одиниці.
Поговоримо про беззнакові числа.
Як розширити беззнакові числа? Для розширення беззнакових чисел
ми використовуємо команду MOVZX (переміщення нульового розширення), синтаксис якої наступний: MOVZX більший адресат, менший джерело.
І ось приклад його використання:
MOVZX - , - .
- більший регістр, а - менший регістр.
Отже, ми переходимо від - до - .
Інший приклад:
MOVZX.
Тут ми беремо - і переносимо його в - .
Розширення підписаних чисел. А команда для розширення знакових чисел - MOVSX, більший адресат, менший
джерело.
Прикладом його використання
є MOVSX - . SX означає розширення знака, - .
Отже, ми беремо - тут, менше число, і розширюємо його до - , переміщуємо його до - , а потім заповнюємо старші
біти правильними двійковими числами, чи то одиницями, чи то нулями.
Іншим прикладом є MOVSX
- , - .
Отже, ми беремо - тут і розширюємо його до -, щоб стати - .
Отже, якщо старший біт дорівнює нулю, ви будете розширювати, використовуючи нулі.
Якщо старший біт дорівнює одиниці, ви будете розширювати, використовуючи одиниці.
Тепер давайте розглянемо кілька практичних прикладів.
Перемістити нульове розширення,
MOVZX.
Спочатку ми переміщуємо одиницю на - , потім переміщуємо нульове розширення, MOVZX - , - .
Отже, це приклад розширення беззнакового переміщення.
Отже, після переміщення він додасть всі нулі ззаду сюди, і ми отримаємо... він отримає 32 біти, тому що - це
32 біти.
Йому байдуже, додатне це число чи від'ємне, тому що він працює
з числами без знака.
Ось чому ми використовуємо розширення з нульовим ходом.
Інший приклад: якщо ми перенесемо це число в - , помітьте, що тут є різниця.
Ось тут.
Тоді ми MOVZX - , - . Ми просто додаємо нулі ззаду, щоб зробити його 32-бітним.
Йому байдуже, чи це одиниця, чи нуль, тому що від'ємні числа нас не цікавлять.
Ми припускаємо, що всі числа додатні, тому не звертаємо уваги на цей параметр.
Тепер давайте розглянемо приклад розширення MOVSX, знака переміщення.
У цьому випадку нас цікавить знак числа, додатний він чи від'ємний.
Отже, спочатку ми переміщуємо одиницю на - , потім ми переміщуємо розширення знака, MOVSX - , - .
То що це дасть?
Він буде ставити одиниці чи нулі?
Він буде дивитися
на цей біт, старший біт - . Якщо це нуль, це означає, що це
додатне число, тому ми додамо нулі ззаду, щоб отримати 32 біти.
Таким чином, всього буде 32 біти.
Інший приклад: MOVSX, розширення знака переміщення.
Цього разу ми переміщуємо це число, одиницю, за якою йдуть всі ці нулі та одиниці, і ми MOVSX - , - . У цьому випадку він буде дивитися
на цей старший біт. Оскільки воно дорівнює одиниці,
то це від'ємне число. Оскільки це від'ємне число, ми
додамо всі одиниці ззаду, щоб збільшити його до 32 біт.
На цьому урок закінчено.
У наступному уроці ми спробуємо це зробити за допомогою x64dbg.
До зустрічі в наступному випуску.