Ir ao conteúdo

Outro Comparação em assembly no 8051


Ir à solução Resolvido por aphawk,

Posts recomendados

Postado

Olá.

Sou um estudante em um curso técnico de eltrônica e estou encontrando dificuldade para criar comparações dentro da linguagem assembly com microcontroladores da familia 8051 com o compilador ASEM-51.

Estou limitado a usar o compilador ASEM-51 (http://plit.de/asem-51/contents.htm), que é o mesmo que usamos no colégio em que estudo; com o kit M8031C da BIT9 (http://www.bit9.com.br/index.php?pag=49&sub_pag=59&conteudo=102) e é o mesmo compilador existente no proteus.

Infelizmente o manual deste compilador não oferece exemplos a respeito de como criar as sintaxes abordando as comparações "maior que", "menor que", "maior ou igual que" e "menor ou igual que" (http://plit.de/asem-51/express.htm) ou de como usar essas comparações em IF's (http://plit.de/asem-51/genifxx.htm).:mellow:

Previamente agradeço. 

  • Solução
Postado

@HelloLuj ,

 

Seu problema não tem nada a ver com o compilador, e sim , entender bem o Assembly dos 8051.

Veja :

 

Compare instruction

The 8051 has an instruction for the compare operation. It has the following syntax:

 

CJNE destination,source,relative address

 

In the 8051, the actions of comparing and jumping are combined into a single instruction called CJNE (compare and jump if not equal). The CJNE instruction compares two operands, and jumps if they are not equal. In addition, it changes the CY flag to indicate if the destination operand is larger or smaller. It is important to notice that the operands themselves remain unchanged. For example, after the execution of the instruction “CJNE A, #67H, NEXT”, register A still has its original value. This instruction compares register A with value 67H and jumps to the target address NEXT only if register A has a value other than 67H.

 

Veja o que acontece nos flags :

 

image.png.83709a0264c641e97493523b817fa2ef.png

 

Essa instrução compara e se não for igual pula para o endereço desejado, E seta o flag Carry para você verificar se é maior ( CY=0 )  ou menor (CY=1) , simplesmente testando o Carry numa próxima instrução, ok ?

 

Não entendo nada dessa familia -ara te ajudar mais do que isso...

 

Paulo

  • Curtir 1
  • Obrigado 1
Postado

Sua solução funcionou perfeitamente para o meu problema!!!

Fiz um programa simples para alterar o padrão na saída do uC dependendo do estado do bit de Carry após uma comparação com CJNE e funcionou exatamente como esperado.

Ainda assim vou buscar entender as ferramentas de IF que sei que o compilador oferece para tentar extrair o máximo de seu potencial, mas por enquanto sua solução vai servir muito bem!!!

Obrigado!

  • Curtir 1
  • Haha 1
Postado

@HelloLuj ,

 

Procure como se cria MACROS nesse compilador.

 

Eu usava o M-80 ( nossa .... 1984... ) e criava várias macros para fazer os trechos de código que eram necessários, era fácil fazer essas tipo "se x > y ir para" e "se x < y ir para" e o montador substituia pelos meus trechos em Assembly.

 

Tá certo que comparar o set de instruções do Z-80 com outros microprocessadores é covardia, mas mesmo assim era muito interessante criar minhas próprias "instruções" com o M-80, pois é certeza de código testado.

 

Paulo

  • Obrigado 1

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

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...

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!