Частина 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 кроків разом через кілька різних архітектур. Тепер ваш чергова черга взяти цю навчальну матеріал на практику і зробити великі речі!
Цей книга буде вашою посилкою, коли ви зустрінете виклики, але нічого не зупинить вас!






