[A little about movzx and movsx] movzx also known as "move with zero extend" meanwhile movsx stand for "move with signed extend" actually it will be hard to understand it completly so I'm gonna give a very simple explanation. movzx as we've read above as :"move with zero extend" this instruction will move our operand with additional zero extension where this movzx will be used to move unsigned value only. the syntax of movzx: ============ movzx destination, source ============ syntax of movsx: ============= movsx destination, source ============= and don't forget that movzx will be used for unsigned value and movsx will be used for signed value. example of movzx: ========== global _start _start: movzx_sample: mov al,0x2f movzx eax,al out: mov al,0x1 int 80h ========== when it's movzx it will suppose your source register as 32 bit register