Для выполнения сгенерированного кода - он должен находиться в исполняемом разделе.
На x86-64 попробуйте это вместо
char* code = mmap(0, 1024 * 1024, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_32BIT | MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
в 32-битной системе map_32bit не имеет значения (он используется на x86-64, чтобы убедиться, что код может войти в первые 2 ГБ и использовать относительную адресацию)