You initialze eax
to 0 so the value is 0
mov eax, 0
EAX-----
AX--
AHAL
00000000
mov al, 96h
EAX-----
AX--
AHAL
00000096
The remainder of the register doesn't change when AL is adressed, so it stays the same.
To illustrate this:
mov eax, -1
EAX-----
AX--
AHAL
ffffffff
mov al, 96h
EAX-----
AX--
AHAL
ffffff96
movesx
loads the value with sign extension. Since 096h is a negative (highest bit is set) it will extend the sign to the whole 32 bit register.
movzx
doe not sign extend and clears the bits.