You want to move the contents of CH to CX on an 8086.
On more recent processors, such as the 80286, you could just shift the value of CX right by 8 positions, with or without sign replication:
; zero extend ch into cx
shr cx,8
; sign extend ch into cx
sar cx,8
These instructions are not available on the 8088 or the 8086. You can must use CL to specify the shift count:
; zero extend ch into cx
mov cl,8
shr cx,cl
; sign extend ch into cx
mov cl,8
sar cx,cl
Yet this method is very slow because the shift by a variable number of positions takes multiple cycles per position.
Here is a faster method:
; zero extend ch into cx
mov cl,ch
xor ch,ch
; sign extend ch into cx
mov cl,ch
neg ch ; set the carry flag if ch is negative
sbb ch,ch ; set all bits if ch was negative, clear them otherwise
If you can destroy AX, you can save code size by using cbw which is designed for this. On original 8086 and especially 8088, small = fast because code fetch was a major bottleneck. That's not true on modern x86, though.
; sign extend ch into ax
mov al, ch
cbw ; sign-extend AL into AX
; optionally move back to cx
xchg cx, ax ; smaller than mov cx, ax
To avoid destroying AX, you could do mov cl,ch ; xchg ax,cx ; cbw and stop there, or do a final xchg ax,cx to just sign-extend CH into CX and restore everything else. xchg with AX is a 1-byte instruction, and so is cbw and cwd (extend AX into DX:AX, e.g. before 16-bit idiv)
cbw is exactly like 386 movsx ax, al.