Код C ниже:
s32 load_string(char* string_new, char const* string_orign)
{
StrEntry *entry = search_str_entry(string_orign);
u8 buff_b[32];
u16 buff_u[32];
s32 read_size = 0;
void *str_file = 0;
if (entry != 0){
cmemclr(buff_b, 32);
cmemclr(buff_u, 64);
sprintf(&buff_b[0], "c:/data/%03d.str", entry->fid);
c2w(&buff_u[0], &buff_b[0], 32);
if (TryOpenFile(&str_file, buff_u, OPEN_MODE_READ) == 0){
cmemclr(string_new, 256);
TryReadFile(&read_size, str_file, entry->offset, string_new, entry->size);
CloseFile(str_file);
return (s32)entry->size;
}
}
return 0;
}
Разборка этой функции:
003464ac <load_string>:
3464ac: e92d4010 push {r4, lr}
3464b0: e1a00001 mov r0, r1
3464b4: ebffffda bl 346424 <search_str_entry>
3464b8: e3500000 cmp r0, #0
3464bc: 08bd8010 popeq {r4, pc}
3464c0: eafffffe b 3464c0 <load_string+0x14>
Мы можем видеть, что если раздел становится бесконечным циклом, почему?
Я использую опцию -Os optimize для компиляции этого кода.
Версия gcc
gcc версия 8.1.0 (devkitARM выпуск 49).
Edit:
cmemclr - простая встроенная функция:
static inline void cmemclr(void *buf, u32 size)
{
u8 *dst = (u8*)buf;
while(--size >= 0){
dst[size] = 0;
}
}