Ir ao conteúdo
  • Cadastre-se

Assembly PIC MOVF


Ir à solução Resolvido por vtrx,

Posts recomendados

O datasheet do 16F628A diz que ao usar a função MOVF o valor do operando pode ser de 0 a 127:

 

ZTci51B.png

 

Mas nos testes aqui o PIC está movendo valores maiores que 127, com a função MOVF, normalmente.

MOVLW  0xFF        ; W=255MOWF   variavel    ; variavel=255 MOVLW  0x00        ; w=0MOVF   variavel,W  ; w=255 Deveria bugar aqui, não?   <<---------<<----------

Tipo, ainda bem que está atribuindo os 8 bits certinho (já estou doido para usar o 24F pois estou achando os 8 bits muito pouco xD), mas está estranho para mim... Alguém pode me explicar?

 

Obrigado!

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

isto é que é quase que literalmente escovar bits kk

Não, não deveria bugar. Perceba o bit dfff ffff dentro da área 'programável' [00 1000 = 'comando' fixo]

pelo que entendi o último bit controla o destino do valor carregado (MOVido). Se zero (até 127) o valor fica tanto em REG1 como em W (W=REG1). Se 1 (maior que 127) fica só em REG1.

Também afeta o flag Z. Um compilador C deve usar este recurso pra informar que a variável "signed char" é negativa ou positiva (de -127 a +127)

Entendeu? ...é acho que nem eu kk

Aguarde opinião de um assembleiro fanático

abç

Link para o comentário
Compartilhar em outros sites

Fiz alguns testes considerando o que você disse @Isadora Ferraz o byte, mesmo sendo maior que 127, é movido corretamente tanto para o WORK quanto para o F (variavel neste caso).



MOVLW B'01010101' ; W='01010101'
MOVWF variavel ; variavel=B'01010101'
 
MOVLW B'11111111' ; W=B'11111111'
 
XORWF variavel,0 ; (XOR entre var=01010101 e W=11111111 armazena resultado em W) 
                  ; variavel=B'01010101' e W=B'10101010' (>127)
 
-----------------------------------------------------------------------------------------
 
MOVLW B'01010101' ; W=0
MOVWF variavel ; variavel=0
 
MOVLW B'11111111' ; W=B'11111111'
 
XORWF variavel,1 ; (XOR entre var=01010101 e W=11111111 armazena resultado em var) 
                  ; variavel=B'10101010' (>127) e W=B'11111111'


 

Também fiz testes para valores menores que 127 e todos os bits são movidos corretamente (o byte inteiro), tanto para W quanto para F.



MOVLW B'01010101' ; W='01010101'
MOVWF variavel ; variavel=B'01010101'
 
MOVLW B'01111111' ; W=B'01111111'
 
XORWF variavel,0 ; (XOR entre var=01010101 e W=01111111 armazena resultado em W) 
                  ; variavel=B'01010101' e W=B'00101010' (<127)
 
-----------------------------------------------------------------------------------------
 
MOVLW B'01010101' ; W=0
MOVWF variavel ; variavel=0
 
MOVLW B'01111111' ; W=B'01111111'
 
XORWF variavel,1 ; (XOR entre var=01010101 e W=01111111 armazena resultado em var) 
                  ; variavel=B'00101010' (<127) e W=B'01111111'


 

Mudei de função para ficar mais fácil fazer os testes. A XORWF também possui o 'dezinho' d para destino... Do datasheet:

 

UDTPj9N.png

 

Vou acabar aceitando e seguindo com a vida UAhuHauHauhUAhUHauHA...  :)

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

então sorry. no afã de responder rápido chutei 1/2 errado. E de acordo com sua interpretação, 1/2 sem sentido um mc de 8 bits manipular só 7 né. Portanto ele tem sim que mover maior que 127. Foi +- isso que quis dizer. Enfim...

 

Como a fé, aceite antes, siga vida e entenda... 'depois'...

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Hmmmm... Entendi! É isso mesmo @vtrx... O interessante é que antes de ir para a programação eu li o datasheet inteiro e não vi essa informação, apesar de ela estar lá  :(

 

4vXhi3Z.png

 

POR ISSO A PARADA É DIVIDIDA EM BANCOS (BANK0, BANK1...) CADA UM COM 127 POSIÇÕES HhuhUAHUhauha

 

Show de bola... Obrigado @vtrx e @Isadora Ferraz pelas respostas!

Link para o comentário
Compartilhar em outros sites

... E você confundiu o "f" com o "d".

O "f" corresponde a um endereço de algum registro. O "d" é um valor de 1 bit. Se 0, o destino  é o W, se 1, o destino é o registro.

Dependendo da instrução, o d pode ser um valor de 8 bits.

Ex.

MOVLW, x

x é um valor dentre os 256 valores possíveis.

MOR_AL

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...