I have good experience teaching a toy assembly (really super-simple) for freshmen before starting the standard C 'intro to programming course'
they get the idea of memory addresses, read/write, registers, attribution, etc,
before I would get many students that would not understand:
1) why
x = x + 1
is not wrong ( they used to think x = x + 1 => x - x = 1 => 0 = 1 wrong! )
2) why those attributions are all the same:
int a;
a = '0'; a = 48; a = 0x30; a = 0b11000;
after the toy assembly course over a non-existing toy computer, they got these issues easily.
also teaching pointers was facilitated.