Última questão da P2

3 views
Skip to first unread message

Stefan Teixeira

unread,
Dec 15, 2010, 11:20:23 AM12/15/10
to Comp-Prog
Fernando, pode explicar +- essa questão da P2? Fiquei muito confuso logo no início da main, em que ele ficava adicionando vários números em hexa na pilha, mas tava usando movw, aí eu não sabia se ia adicionar só parte do número...
Enfim, sempre que aparece um w ou b eu me confundo bastante. :P


Grato,
Stefan Teixeira

Fernando Silva

unread,
Dec 15, 2010, 2:20:28 PM12/15/10
to comp...@googlegroups.com
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.
Reply all
Reply to author
Forward
0 new messages