Частина 12 - Дебагування float
Давайте переглянем наш приклад. 0x05XMD_float.c as слідує.
#include <stdio.h> #include "pico/stdlib.h" int main() { stdio_init_all(); while(1) { float x = 40.5; printf("%f\n", x); sleep_ms(1000); } return 0; }
Давайте запустимо наш дебагер.
radare2 -w arm -b 16 0x05_float.elf
Давайте зробимо аналіз автоматично.
aaaa
Давайте спробуємо потрапити до головної частини програми.
s main
Давайте перейдемо в візуальний режим, натиснувши V і потім p два рази, щоб потрапити до хорошого дебагерського перегляду.
Ми бачимо форматний вказівник в [0x0000033c].
:> psz @ [0x0000033c] %f
Float знаходиться в [0x00000340].
:> pff @ [0x00000340] 0x00004000 = 9.32830524e-09
Не хвилюйтеся, що float не дуже точний, оскільки ця машина x64. Що важливо побачити - це значення 0x00004000. Тоді ви запитаєте себе, а чому це не 40.5? Що відбувається?
Ок...
Pico не має власного математичного процесора, тому воно обробляє float і double за допомогою програмного забезпечення. Тому 0x00004000 буде представленням 40.5 у десятковому вигляді.
Також, наприклад, якщо значення було 40.4, воно було б 0x00003333. Наперекір цьому, 40.6 було б 0x00004ccc.
Давайте подивимося на наступну таблицю, яка допоможе ілюструвати цю ідею.
0x3ff00000 = 1.000000 0x3ff00001 = 1.000001 0x3ff00002 = 1.000002... 0x3ff0000f = 1.000015 0x3ff00010 = 1.000016 0x3ff00011 = 1.000017 etc...
Остаточні значення в цих 4 байтах (32-біти) визначатимуть значення float.
У наступному урокі ми змінимо float і продемонструємо цю логіку.