Частина 20 - Дебагування Вхідних Даних
Сьогодні ми дебагуватимемо нашу функцію вхідних даних. Давайте переглянемо свій код.
Перегляньте файл input.c наступним чином.
#include <stdio.h> #include <string.h> #include "pico/stdlib.h" #define ZERO 0x30 #define NINE 0x39 #define PERIOD 0x2e #define CAPITAL_A 0x41 #define LOWER_CASE_Z 0x7a #define BACKSPACE 0x08 #define DEL 0x7f void input_proc(char type, char* p_usb_char, char* p_usb_string, const int* p_USB_STRING_SIZE) { *p_usb_char = '\0'; *p_usb_char = getchar_timeout_us(0); if(*p_usb_char == BACKSPACE || *p_usb_char == DEL) { if(p_usb_string[0]!= '\0') { printf("\b"); printf(" "); printf("\b"); p_usb_string[strlen(p_usb_string)-1] = '\0'; } } if(type == 'f') { char* period; while((*p_usb_char >= ZERO && *p_usb_char <= NINE) || *p_usb_char == PERIOD) { if(*p_usb_char == PERIOD) period = strchr(p_usb_string, '.'); if(period == NULL) { if(strlen(p_usb_string) < *p_USB_STRING_SIZE) { putchar(*p_usb_char); strncat(p_usb_string, p_usb_char, 1); } *p_usb_char = '\0'; } else break; } } else if(type == 'd') { while(*p_usb_char >= ZERO && *p_usb_char <= NINE) { if(strlen(p_usb_string) < *p_USB_STRING_SIZE) { putchar(*p_usb_char); strncat(p_usb_string, p_usb_char, 1); } *p_usb_char = '\0'; } } else if(type == 's') { while(*p_usb_char >= CAPITAL_A && *p_usb_char <= LOWER_CASE_Z) { if(strlen(p_usb_string) < *p_USB_STRING_SIZE) { putchar(*p_usb_char); strncat(p_usb_string, p_usb_char, 1); } *p_usb_char = '\0'; } } } void flush_input(char* p_usb_string) { p_usb_string[0] = '\0'; }
Перегляньте файл print.c наступним чином.
#include <stdio.h> #include "pico/stdlib.h" #include "input.h" #define RETURN 0x0d void print_proc(char* p_usb_char, char* p_usb_string) { if(*p_usb_char == RETURN) { if(p_usb_string[0] == '\0') printf("\n"); else printf("\n%s\n", p_usb_string); flush_input(p_usb_string); } }
Перегляньте файл main.c наступним чином.
#include <stdio.h> #include "pico/stdlib.h" #include "print.h" #include "input.h" int main() { stdio_init_all(); const int USB_STRING_SIZE = 100; char usb_char; usb_char = '\0'; char usb_string[USB_STRING_SIZE]; usb_string[0] = '\0'; while(1) { input_proc('f', &usb_char, usb_string, &USB_STRING_SIZE); print_proc(&usb_char, usb_string); } return 0; }
Давайте запустимо наш дебагер.
radare2 -w arm -b 16 main.elf
Давайте зробимо аналіз автоматично.
aaaa
Давайте перейдемо до головної частини програми.
s main
Давайте перейдемо до візуального режиму, натиснувши V і потім p двічі, щоб потрапити до хорошого режиму дебагування.
Спочатку ми переглядаємо main.
Ми бачимо наш stdio_init_all call, який встановлює IO, і бачимо 0x64 в r3, який є нашим кроком 100 десятичним, щоб встановити USB_STRING_SIZE, і встановлюємо наш _usb_char значення і ініціалізуємо його до 0, а потім usb_string і ініціалізуємо його до 0.
Давайте переглянемо нашу функцію print_proc.
Спочатку ми перевіримо, чи наш вказівник на usb_char або p_usb_char рівний клавіші RETURN або 0xd, і якщо так, то здійснюємо перехід.
Далі ми ітеруємося по p_usb_string, поки не досягнемо кінця рядка, і потім call нашу функцію _printf, яка, як ми бачимо тут, є обгорткою навколо функції c printf.
Нарешті, ми flush_input..
Наша функція input_proc трохи складніша.
У цьому випадку ми використовуємо функцію getchar_timeout_us і обробляємо клавіші BACKSPACE і DELETE.
Далі ми call нашу функцію putchar проти 0 і 9 і перевіряємо strlen і належним чином будуємо наш рядок з strncat.
Далі ми належним чином обробляємо нашу логіку PERIOD щоб забезпечити, що тільки один PERIOD вводиться, оскільки десяткова частина не може обробляти 2 періоди.
Далі ми належним чином обробляємо наш цикл.
Нарешті, ми маємо нашу функцію flush_input.
У цьому випадку ми просто очищаємо буфер вхідних даних, встановлюючи p_usb_string на нульовий символ.
Це була більша сесія дебагування, тому будь ласка, візьміть свій час і порівняйте збірку з джерелом, щоб глибше зрозуміти кожен абзац, який я тут описую.
Це закінчує нашу початкову навчальну подорож. У цій подорожі ми здійснили 197 кроків разом через кілька різних архітектур. Тепер ваш чергова черга взяти цю навчальну матеріал на практику і зробити великі речі!
Цей книга буде вашою посилкою, коли ви зустрінете виклики, але нічого не зупинить вас!