Hi,
I was now wondering why the two are different, but in this case the point is that the
movzx byte eax, [ebx]
is not different but actually and error, because we are applying a size specifier to a register that has its own implicit size getting a warning, and being ignored, while the other which is a location in memory has no one.
But there is something more I would need to think about this, because
mov byte eax, [ebx]
only fires the warning.
Any way, as of my minimal knowledge, if the destination is a register, you are using the register size to tell how much you are storing. That works for mov while is the opposite for movzx where there is a need to put the size specifier before the source operand, where in mov is an error.