Частина 13 - Хакінг флоата
Давайте переглянем наш приклад. 0x05_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 два рази, щоб потрапити до хорошого дебагерського перегляду.
Флоат знаходиться на [0x00000340].
:> pff @ [0x00000340] 0x00004000 = 9.32830524e-09
Як ми обговорили в останньому урокі, не хвилюйтеся, що флоат не дуже точний, оскільки ця машина x64. Що важливо побачити, це значення 0x00004000.
У нашому останньому урокі ми також пояснили, як працює Pico щодо флоатів. Давайте переглянемо деякі основи.
0x3ff00000 = 1.000000 0x3ff00001 = 1.000001 0x3ff00002 = 1.000002... 0x3ff0000f = 1.000015 0x3ff00010 = 1.000016 0x3ff00011 = 1.000017 etc...
Давайте змінимо на 1.000000 наступним чином.
Наш мікроконтролер має малендійну архітектуру, тому якщо ми хочемо змінити наш 40.5 на 1.0, нам потрібно помістити цю вартість у зворотньому порядку байтів, тому...
0x3ff00000
Нам потрібно...
0x0000f03f
Отже, нам потрібно змінити значення на наступному місці.
wx 0x0000f03f @ 0x00000340
Усі, що залишилося зробити зараз, це вийти і перетворити нашу .elf на .uf2!
./elf2uf2/elf2uf2 0x05_float.elf 0x05_float.uf2
Під'єднайте Pico і переконайтеся, що натисніть кнопку BOOTSEL або використовуйте налаштування, які я надав у частині 2.
cp 0x05_float.uf2 /Volumes/RPI-RP2
Давайте побачимо!
screen /dev/tty.usbmodem0000000000001
АХА!
1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000
Тут ми змінили значення на 1.000000 і дали 1 секунду, щоб воно збереглося.
У наступному урокі ми обговоримо тип даних double.