Code:
while(memory_map < MBI->mmap_addr + MBI->mmap_length) {
memory_map = (multiboot_memory_map_t*)((unsigned int)memory_map + memory_map->size + sizeof(memory_map->size));
You are skipping the first entry of the memory map, and reading past the end of the memory map.
Code:
char* str_result;
You are declaring a null pointer for your temporary variable. You should declare an array instead. Make sure the array is large enough to store the entire string, including the null terminator.
Code:
itoa(memory_map->addr, str_result, 16);
Your itoa() function prints signed integers, but the address is an unsigned integer. Your itoa() function handles 32 bits, but the values you want to print are 64 bits.
There may be other problems with your code as well; these are only the ones I spotted after a quick look.