Part of the challenge is that the registers are zero’d, so the first subtract is not necessary.
Also, shift/rotates by 1 do not have an immediate value, they are separate instructions (first introduced on the 8086, the 8086 did not have multiple bit shift/rotate by immediate). So, I would argue they can be used (like inc/dec by 1 do not have an explicit immediate value).
So, here is an 11 instruction solution:
sub eax, eax ;eax = 00000000
lahf ;eax = 00004600 (flags = SZ0A0P1C)
mov cl, ah ;ecx = 00000046
rol ax, cl ;eax = 00008011 (eax rol 6)
ror ax, 1 ;eax = 0000C008
movzx edx, ax ;edx = 0000C008
bswap edx ;edx = 08C00000
ror al, cl ;eax = 0000C020
or ecx, edx ;ecx = 08C00046
or cx, ax ;ecx = 08C0C066
inc ch ;ecx = 08C0C166