Stefan, vamos lá então:
Seguinte, vou tentar explicar até certo ponto da questão, tendo em vista a dúvida que você frisou, ai depois você tenta continuar, e se tiver dúvida denovo, é só falar.
Aqui vai a parte do código que eu vou analisar, que são as primeiras linhas da main:
PUSH %EBP
MOV %ESP, %EBP
AND $0xFFFFFFF0, %ESP
PUSH %ESI
PUSH %EBX
SUB $0x28, %ESP
Até aqui são procedimentos para reservar espaço, e guardar valores que se pode querer recuperar.
---------------------------------------------------
MOVW $0xFFFF, 0x16(%ESP)
MOVW $0x2, 0x18(%ESP)
MOVW $0xFFFD, 0x1A(%ESP)
MOVW $0x0, 0x1C(%ESP)
MOVW $0x5, 0x1E(%ESP)
Pois bem, só de analisar por alto, dá para perceber que o MOVW, como ele move um valor de 16 bits, ele ocupa 2 posições de memória para guardar tal valor, só ver a sequência de posições 0x16, 0x18, 0x1A...
Então vou tentar te explicar para você não errar mais:
Se eu digo MOVW Imediato, X
O Imediato só pode ter até 16 bits, e ele todo vai ser guardado em X, e conforme o manual do assembly 80386, X deve ser uma posição de memória, ou um registrador de 16 bits(isso no caso de W, com B troque o 16 por 8).
Po, mas se eu quero transportar um valor de 8 bits para um cara que comporta 16 bits, ou de 16 bits para 32, ou até 8 para 32? ai que entram o movzXY, movsXY
então quando temos:
MOVW $0xFFFF, 0x16(%ESP)
MOVW $0x2, 0x18(%ESP)
MOVW $0xFFFD, 0x1A(%ESP)
MOVW $0x0, 0x1C(%ESP)
MOVW $0x5, 0x1E(%ESP)
Estamos movendo exatamente o que está na esquerda para o que está na direita.
O que você deve ter atenção:
o bit de sinal é o bit mais a esquerda, então se representarmos o mesmo valor 0xFFFF, em 16 e 32:
0xFFFF em 16 bits, é o -1
agora se eu escrevo:
0xFFFF, ou no caso, 0x0000FFFF, em 32 bits, ele é o 65535
O sinal é com quem você tem que tomar mais cuidado nessas conversões.
Qualquer dúvida, só falar.