#include #include int main(void) { const uint32_t base[3] = {32u * 1024, 34u * 1024, 28u * 1024}; const uint32_t bounds[3] = {2u * 1024, 3u * 1024, 2u * 1024}; const char *names[3] = {"code", "heap", "stack"}; const uint32_t vas[3] = {100, 4200, 7168}; for (int i = 0; i < 3; i++) { uint32_t va = vas[i]; uint32_t seg = (va >> 12) & 3u; uint32_t offset = va & 0xFFFu; printf("VA %u (0x%x): ", va, va); if (seg > 2u) { printf("invalid segment\n"); continue; } if (offset >= bounds[seg]) { printf("segmentation fault (offset %u >= %u in %s)\n", offset, bounds[seg], names[seg]); } else { uint32_t pa = base[seg] + offset; printf("segment %s, offset %u -> PA %u\n", names[seg], offset, pa); } } return 0; }