Памяти мало, даже очень мало и она сегментирована. Основная память
(idata) и её адреса (256 байт, 0x00-0xFF) очень плотно всем забиты.
Для стека места мало. Поэтому (вложенные) вызовы функций и передача
аргументов делается компилятором с выкрутасами. В этом же куске
памяти находятся 4 банка для прерываний, но обычно только 1 банк
используется. Доступ быстрый, если у вас байты, а если int16_t или
int32_t, то становится печально и приходится байты считать. Или
размещать это всё в расширенной памяти - xdata. Указатель на память (char *), если не объявлен тип памяти - будет 24 бита, а если объявить (idata, pdata, xdata, code), то будет 8 или 16 бит. GCC такие фокусы не умеет. Короче, приходится очень тщательно планировать работу с данными/буферами/переменными. Я люблю 8051.