I'm under 30, and I'm probably one of the last programmers who learned assembly language with DOS Debug's 16-bit assembly.
Each register has its own personality: BX is the base, CX is the count, AX is the accumulator, SI and DI are source/destination indices, BP is the stack pointer.
If you have a pointer, you want to put it in SI, DI, or BX so you can use a memory load instruction like MOV AX,[BX]. If you have a pointer and an offset, you want one of them to be in BX, and the other in either SI or DI -- because there are instructions MOV AX,[BX+SI] and MOV AX,[BX+DI], but not MOV AX,[SI+DI].
The x86 16-bit instruction set is full of places where your operands have to be in certain registers. The REP MOVSB instruction requires five registers to be initialized; you don't have any choice of which five.
Kids these days and their RISC machines where there are a hundred registers and they're all the same -- they don't even have names, just numbers. Get off my lawn!
(Yes, I'm aware that your software can be much more efficient with more registers, it's a good investment of increased silicon capacity Moore's law has given us since then, there are fewer compiler writers wandering around who have been driven insane, etc...but the point is, the constraint satisfaction process that's part of writing a 16-bit program is rather fun for the programmer, like Sudoku.)