WEBVTT

00:02.070 --> 00:03.400
Привіт і ласкаво просимо назад.

00:03.420 --> 00:06.660
Сьогодні ми вивчимо інструкцію MUL.

00:06.810 --> 00:08.460
MUL розшифровується як Multiply.

00:11.010 --> 00:12.060
Приклади MUL.

00:12.390 --> 00:13.830
Це синтаксис.

00:14.340 --> 00:19.770
MUL - це ключове слово, за яким слідує регістр.

00:20.310 --> 00:25.650
Регістром може бути регістр EAX, EBX тощо.

00:27.350 --> 00:35.060
Отже, він бере значення з вказаного вами регістра, множить його на AL і зберігає результат

00:35.060 --> 00:36.380
в AX.

00:36.920 --> 00:40.860
Отже, це однобайтовий регістр.

00:41.480 --> 00:47.960
А потім, коли він зберігає результат назад, він записує його в регістр слів, який складається з двох

00:47.990 --> 00:48.620
байт.

00:48.800 --> 00:51.800
Тому він завжди вдвічі більший за оригінал.

00:52.730 --> 00:57.620
Інший приклад: AX помножити на регістр.

00:57.950 --> 01:02.570
Отже, у цьому випадку AX - це регістр слів, який складається з двох байт.

01:03.260 --> 01:11.660
Коли він перемножується з іншим регістром, результат записується назад у

01:11.840 --> 01:13.820
регістри DX і AX.

01:13.820 --> 01:16.430
Тож частина результату буде в DX.

01:16.580 --> 01:19.190
А інша частина результату буде в AX.

01:19.670 --> 01:23.570
Знову ж таки, це вдвічі більше, ніж розмір оригінального реєстру.

01:23.690 --> 01:29.430
Початковий регістр - це слово, а результат - DWORD.

01:31.000 --> 01:32.080
Наступний - EAX.

01:32.110 --> 01:32.770
EAX.

01:33.310 --> 01:37.990
Отже, у цьому випадку це регістр DWORD.

01:38.230 --> 01:45.280
Отже, ви берете DWORD, значення в регістрі DWORD, перемножуєте з іншим регістром,

01:45.280 --> 01:50.140
і результат множення зберігається назад в EDX:EAX.

01:51.040 --> 01:56.860
Таким чином, частина результату буде в EDX, а інша частина - в EAX.

01:57.460 --> 02:03.730
Отже, ми знову бачимо, що результат вдвічі більший за початковий регістр.

02:04.690 --> 02:05.710
Отже, EDX:EAX.

02:07.090 --> 02:11.470
EDX:EAX означає, що EDX і EAX об'єднані разом.

02:12.310 --> 02:17.740
Зверніть увагу, що розмір результату завжди вдвічі більший за розмір оригіналу.

02:17.980 --> 02:23.290
Отже, якщо оригінал - це байт, то результат - це слово.

02:23.410 --> 02:27.280
Якщо оригінал є словом, результатом буде СЛОВО.

02:27.760 --> 02:32.600
Якщо оригінал має формат DWORD, результатом буде QWORD.

02:32.750 --> 02:34.610
Це означає вісім байт.

02:34.940 --> 02:36.260
Отже, це чотири байти.

02:36.290 --> 02:37.310
Це вісім байт.

02:38.240 --> 02:40.040
Це два байти.

02:40.820 --> 02:41.990
А це - СЛОВО.

02:42.230 --> 02:43.160
Це байт.

02:43.160 --> 02:44.120
І це слово.

02:46.340 --> 02:49.120
Тож давайте розглянемо більше прикладів MUL.

02:49.250 --> 02:49.690
МУЛ.

02:50.540 --> 02:52.420
Ось приклад:

02:52.490 --> 03:01.910
MUL ECX. MUL ECX означає, що ви берете значення з регістра ECX, множите його на будь-яке

03:01.910 --> 03:06.770
значення з регістра EAX, і результат зберігається в EDX:EAX.

03:06.770 --> 03:10.940
Це означає, що частина результату в EDX, а частина в EAX.

03:12.020 --> 03:15.650
Отже, ви об'єднуєте їх разом і отримуєте повний результат.

03:17.060 --> 03:18.250
Інший приклад.

03:18.250 --> 03:19.120
МУЛ СІ.

03:20.270 --> 03:30.190
MUL SI - це коли ви берете значення слова в регістрі SI, яке становить два байти, множите на слово в AX,

03:30.190 --> 03:37.840
яке також становить два байти, і результат множення зберігається в DX:AX.

03:37.930 --> 03:43.300
Таким чином, DX:AX, об'єднані разом, дають повний результат.

03:44.350 --> 03:46.630
Інший приклад: MUL AL.

03:47.470 --> 03:51.070
Отже, у цьому прикладі ви берете те, що є в регістрі

03:51.070 --> 03:54.640
AL, і множите на те, що вже є в AL.

03:55.060 --> 04:01.570
У цьому випадку це лише один байт, помножений на інший байт, і результат зберігається у слові, яке складається

04:01.840 --> 04:03.160
з двох байтів.

04:04.740 --> 04:05.760
Інший приклад.

04:06.360 --> 04:10.080
Це неправильна інструкція, оскільки ви не можете вказати константу.

04:10.110 --> 04:15.510
Ви повинні надати реєстр, який ви збираєтеся використовувати для операції MUL.

04:16.560 --> 04:18.640
Тож зараз ми зробимо кілька вправ.

04:18.660 --> 04:21.030
Тож просто запустіть x64dbg.

04:21.480 --> 04:25.710
Відкрийте x64dbg, а потім відкрийте файл template1. exe-файл.

04:27.610 --> 04:31.270
Прокрутіть вниз і почніть писати свій код тут.

04:38.110 --> 04:40.660
Тепер я збираюся ввести весь цей код сюди.

04:40.960 --> 04:49.710
Перші три команди ініціалізують початкові значення для EDX, EAX та ECX.

04:49.720 --> 04:50.770
Тож почнемо звідси.

04:50.770 --> 04:54.670
Ви натискаєте на нього, натискаєте пробіл і починаєте вводити.

04:54.670 --> 04:56.520
MOV EDX,

04:58.770 --> 05:00.570
гекс A B1E2F

05:00.600 --> 05:07.560
F F F.

05:07.560 --> 05:07.560
Натисни Enter.

05:08.070 --> 05:10.170
Наступний: MOV

05:10.440 --> 05:14.280
E AX, 0x3.

05:14.280 --> 05:14.280
Натисни Enter.

05:16.260 --> 05:17.220
Наступний:

05:17.520 --> 05:21.810
MOV ECX, гекс 2.

05:22.170 --> 05:22.770
Натисни

05:22.770 --> 05:23.370
Enter.

05:23.970 --> 05:25.050
Наступний:

05:25.470 --> 05:27.450
MUL ECX.

05:27.840 --> 05:31.620
Натисніть Enter, а потім MUL ECX.

05:31.770 --> 05:42.090
Натисніть Enter ще раз, а потім MOV AX, hex EE EE.

05:42.090 --> 05:42.090
Натисни Enter.

05:43.160 --> 05:44.150
Наступний:

05:44.780 --> 05:47.240
MUL AX. Натисни Enter.

05:47.240 --> 05:48.600
І остання:

05:48.620 --> 05:51.320
MUL CL. Натисни Enter.

05:52.040 --> 05:57.290
Тепер просто зупиніться на мить і перевірте, чи правильно ви ввели інструкції.

05:58.100 --> 06:03.590
Після того, як ви переконалися, що все правильно, ви можете поставити тут точку зупинки звичайним способом, клацнувши

06:03.590 --> 06:08.720
правою кнопкою миші тут, перейшовши до пункту Breakpoint і натиснувши на Toggle, що я вже зробив.

06:09.080 --> 06:10.520
Потім натисни "Виконати".

06:11.870 --> 06:14.600
Якщо ми зараз досягли точки розриву, давайте переступимо через неї.

06:16.040 --> 06:20.600
Тепер він перенесе це значення в EDX, який знаходиться тут.

06:20.990 --> 06:25.670
Тож ми переступаємо через неї і підтверджуємо, що тепер вона має таке значення.

06:26.480 --> 06:29.360
Наступним буде переміщення 3 в EAX.

06:29.780 --> 06:36.710
Давайте переступимо через нього і перевіримо, що тепер він має таке значення: 3.

06:37.370 --> 06:40.190
Далі ми переїдемо 2 в ECX.

06:40.790 --> 06:47.240
Переступимо через нього і перевіримо, що ECX тепер має значення 2.

06:47.930 --> 06:51.050
Тепер ми виконаємо наше перше MUL-обчислення.

06:51.320 --> 06:55.130
Тож давайте відкриємо ваш калькулятор програміста.

06:55.610 --> 06:57.620
Переконайтеся, що ви натиснули на Hex.

06:58.190 --> 07:06.530
А тепер ми візьмемо все, що є в ECX, помножимо на все, що є в EAX, і результат буде

07:06.680 --> 07:10.130
збережено назад в EDX:EAX.

07:10.580 --> 07:12.350
EDX:EAX.

07:12.740 --> 07:17.180
Просто щоб освіжити вашу пам'ять, він зробить так.

07:18.200 --> 07:25.250
Він візьме все, що є в EAX, помножить на все, що є в ECX, і збереже результат назад в EDX:

07:25.340 --> 07:25.750
EAX.

07:25.780 --> 07:26.450
EDX:EAX.

07:28.320 --> 07:31.080
Тож давайте спочатку спробуємо з калькулятором.

07:31.770 --> 07:35.670
Отже, давайте спочатку введемо те, що знаходиться в EAX, тобто 3.

07:37.860 --> 07:44.310
Потім ми помножимо на те, що знаходиться в ECX, тобто на 2.

07:44.880 --> 07:50.490
Отже, ми вводимо 2, натискаємо і натискаємо рівність, отримуємо 6.

07:50.490 --> 07:54.370
Таким чином, ми очікуємо побачити 6 всередині EDX:EAX.

07:54.390 --> 07:55.110
EDX:EAX.

07:56.300 --> 07:56.870
Поглянь.

07:56.910 --> 07:57.650
Тепер так.

07:57.650 --> 08:00.740
Цей EAX тепер ось такий.

08:01.550 --> 08:02.810
Тож давай переступимо.

08:02.990 --> 08:06.470
І тепер EDX - це все нулі, а EAX - 6.

08:06.470 --> 08:09.590
Таким чином, повний результат знаходиться в EDX:EAX.

08:09.590 --> 08:12.710
Якщо об'єднати це і це, отримаємо 6.

08:12.710 --> 08:14.960
Отже, результат має довжину вісім байт.

08:15.410 --> 08:20.450
Ці вісім нулів об'єднані тут з усіма цими значеннями.

08:20.450 --> 08:22.970
Так ми отримуємо

08:23.360 --> 08:29.900
довгий результат: 0000000000000006.

08:29.900 --> 08:31.220
Це дуже довгий результат.

08:31.220 --> 08:32.630
Це восьмибайтовий результат.

08:33.080 --> 08:43.280
Тому, щоб освіжити вашу пам'ять, восьмибайтовий результат: об'єднайте EDX з EAX, щоб отримати повний результат.

08:43.280 --> 08:45.110
Отже, це восьмибайтовий результат.

08:46.190 --> 08:53.000
Отже, переходимо до наступної інструкції. Він знову помножить ECX на EAX.

08:53.570 --> 08:56.330
Тож тепер перейдемо до нашого калькулятора.

08:57.530 --> 09:01.550
Наш калькулятор тепер показує, що - гаразд, давайте все очистимо.

09:01.820 --> 09:03.740
Що ж зараз є в EAX?

09:04.620 --> 09:07.460
EAX зараз має 6, тому ми вводимо 6 першим.

09:07.700 --> 09:10.850
Отже, він помножить ці 6 на ECX.

09:11.210 --> 09:12.410
Що входить до складу ECX?

09:12.440 --> 09:13.790
ECX дорівнює 2.

09:13.820 --> 09:21.350
Отже, ми множимо на 2, дорівнює, і отримуємо 12.

09:21.680 --> 09:23.030
C - це 12.

09:23.030 --> 09:27.470
Як бачите, у десятковій системі числення це 12; C - гекс для 12.

09:27.860 --> 09:33.380
Тож ми очікуємо побачити результат в EDX та EAX.

09:33.380 --> 09:35.630
Тож EDX все одно дорівнюватиме нулю.

09:36.050 --> 09:37.670
EAX має бути рівним C.

09:37.850 --> 09:40.550
Тож давайте відійдемо від цього і подивимося, що станеться.

09:41.750 --> 09:43.790
EDX дорівнює нулю.

09:43.880 --> 09:47.990
EDX- EAX - EDX дорівнює нулю, а EAX дорівнює C.

09:47.990 --> 09:49.190
Ось і весь результат.

09:49.220 --> 09:55.910
Повний результат - це всі ці нулі в EDX, об'єднані з усіма цими значеннями в EAX.

09:55.910 --> 09:56.910
Ось такий у нас результат.

09:56.910 --> 10:01.080
Наш повний результат, згідно з цим форматом.

10:02.100 --> 10:06.270
Тепер ми перемістимо це значення в AX.

10:06.450 --> 10:12.630
Отже, це значення є двобайтовим або словесним, і AX також є словом.

10:12.840 --> 10:20.100
Отже, AX - це фактично ці два байти, 000C - це і є AX.

10:20.100 --> 10:23.460
Отже, ми перемістимо EEEE у ці два байти.

10:24.120 --> 10:32.720
Підійдіть і переконайтеся, що тепер EEEE знаходиться всередині нижнього слова для EAX.

10:35.240 --> 10:42.600
Тепер ми помножимо все, що знаходиться в AX, на AX, а потім збережемо результат у DX:AX.

10:42.830 --> 10:44.420
Ось така формула.

10:44.450 --> 10:49.130
Формат - він візьме все, що є в аргументі, в регістрі.

10:49.130 --> 10:56.170
У цьому випадку регістр - AX, множимо на сам AX, а потім зберігаємо результат у DX:AX.

10:56.180 --> 11:00.020
Таким чином, частина результату буде в DX, а частина в AX.

11:00.140 --> 11:02.660
Тож давайте спочатку спробуємо це зробити за допомогою калькулятора.

11:03.530 --> 11:05.000
Давайте очистимо вхід.

11:05.330 --> 11:07.490
Отже, давайте подивимося, що є в AX.

11:09.020 --> 11:17.240
AX - це EEEE, тож давайте введемо це: EEEE. І він буде примножуватися з AX.

11:18.830 --> 11:28.400
Помножте на EEEE. EEEE помножте на EEEE і натисніть "дорівнює" - ви отримаєте

11:28.900 --> 11:31.130
таке значення: DEFF6544.

11:31.250 --> 11:41.540
Отже, DEFF буде зберігатися в DX - ці два байти тут - і 6544 буде зберігатися в двох байтах тут, AX, відповідно

11:41.570 --> 11:43.610
до цього формату.

11:44.320 --> 11:49.120
Так, він зберігається частково в DX і частково в AX.

11:49.240 --> 11:52.780
Тож давайте переступимо через цю інструкцію і подивимося, як це відбувається.

11:53.940 --> 11:54.900
І це дійсно

11:54.930 --> 11:55.590
так,

11:57.420 --> 12:07.700
ви бачите, що ви отримуєте частину в DX: DEFF, а частину в AX: 6544.

12:08.130 --> 12:13.830
Щоб освіжити вашу пам'ять: частина в DX, частина в AX.

12:14.250 --> 12:21.450
Отже, частина DX зберігає DEFF, а частина AX - 6544.

12:22.110 --> 12:24.120
Як ми і прогнозували

12:24.150 --> 12:28.430
тут: DEFF 6544.

12:29.910 --> 12:30.240
Гаразд.

12:30.270 --> 12:31.740
Тепер повернімося до останнього.

12:32.310 --> 12:33.090
Останній.

12:33.090 --> 12:35.540
Ми збираємося примножити все, що є в CL.

12:35.910 --> 12:37.410
CL - один байт.

12:37.440 --> 12:40.230
CL має на увазі цей 02.

12:40.260 --> 12:41.280
Це КЛ.

12:41.610 --> 12:45.300
Ми помножимо цей CL на один байт в AL.

12:45.810 --> 12:51.530
Отже, це AL, що дорівнює 44, а результат буде збережено в AX.

12:51.540 --> 12:54.330
Тож це стосується саме цього формату.

12:54.900 --> 12:59.220
Що б не було в регістрі, помножте AL і збережіть його в AX.

12:59.850 --> 13:02.580
Тож спочатку ми спробуємо це зробити на нашому калькуляторі.

13:02.970 --> 13:07.830
Тож відкривайте наш калькулятор. Введіть все, що є в AL.

13:07.980 --> 13:09.720
Отже, АЛ - 44.

13:10.410 --> 13:11.760
Отже, вводимо

13:11.790 --> 13:18.240
4-, спочатку очистимо це. Введіть 44, що відноситься до AL, а потім ми помножимо на все,

13:18.240 --> 13:19.350
що знаходиться в CL.

13:19.380 --> 13:24.980
CL дорівнює 02, тому помножте на 2, і ми отримаємо 88.

13:25.140 --> 13:31.410
Отже, цей 88 має зберігатися всередині AX, тому він буде 0088.

13:32.280 --> 13:34.770
Тож давайте переступимо через це і подивимося, як це відбувається.

13:35.220 --> 13:37.640
Дійсно, ми отримуємо 0088.

13:38.640 --> 13:47.100
Пам'ятайте, що формат один байт помножений на один байт дає два байти. Один байт, помножений на один байт, дає слово - це означає,

13:47.100 --> 13:50.790
що воно вдвічі більше за оригінал.

13:50.790 --> 13:58.570
Отже, в цьому випадку один байт спочатку знаходиться в CL, тобто 02, помножений

13:58.600 --> 14:05.800
на один байт, що знаходиться в AL, і результат зберігається в AX: 0088.

14:06.550 --> 14:12.370
Отже, ось як можна виконувати множення за допомогою інструкції MUL в асемблері.

14:12.580 --> 14:20.290
Тож давайте збережемо це зараз. Файл, Виправлення, клацніть Файл виправлення, а потім тут ви можете дати йому назву. Назвемо його

14:20.290 --> 14:28.060
06-мул. exe і натисніть кнопку Зберегти. Натисни ОК.

14:28.240 --> 14:30.100
На цьому відео все.

14:30.130 --> 14:31.570
Дякуємо за перегляд.
