Moderadores: 51, guest2003, brasilma
unsigned char carry;
unsigned char data = 0x12;
carry = (data&0x80)?1:0;
data = (data << 1; + carry;
loop:
... codigo ...
subq.l #1,d0
bnz loop;
loop:
subl r0,#1,r0
... codigo ...
bnz r0,loop
cmp.l #0,a0
beq out
cmp.l #0,a1
beq out
...
out:
beq r0,out
beq r1,out
...
out:
if(p!=0 && q!=0)
{
... codigo ...
}
Djalma Toledo Rodrigues escreveu:Mas, Marcelo você não levou em consideração o seguinte:
Muitas vezes se usa Flags, não os do STATUS, para o Contrôle(*) do Pograma, então o Humano pode colocar agrupar
os 'seus' Flags, por exemplo, em um unico Byte localizado na melhor posição.
Por exemplo no PIC se não uso um determinado periférico posso utilizar sua posição na SFR para isso.
Eu mesmo já usei até aquelas posições vagas que o Datasheet diz não estar implementada (e estava).
Fazendo uma analogia: Como se sabe que o Basic vai percorrer todo o Programa apartir do endereço inicial, para localizar uma Subrotina o Progamador "esperto" colocava as Subrotinas antes do Programa Principal.
Assim:
10 Goto 200
20 Subrotina X
80 Return
90 Subrotina Y
190 Return Fim das Subs
Este procedimento faz o programa rodar mais rápido.
Resumindo: O Humano inteligente pode otimizar.
(*) O GRAFCET por exemplo que só trabalha com BIT --Todas as Variáveis, todos Comandos, todos Sensores etc. 1 Bit
.
Eu mesmo já usei até aquelas posições vagas que o Datasheet diz não estar implementada (e estava).
brasilma escreveu:... usei toda memória que sobrava do RTC e display, para o processador.
struct packed_struct {
unsigned char b0:1;
unsigned char b1:1;
unsigned char b2:1;
unsigned char b3:1;
unsigned char b4:1;
unsigned char b5:1;
unsigned char b6:1;
unsigned char b7:1;
} flags;
flags.b0 = 1;
ori.b #1,(flags)
Djalma Toledo Rodrigues escreveu:Sei que se pode Implementar isso em C , Ponteiroo etc. mas, não é da natureza do C .
Para o Programador em C, o µC, ou o µP, é uma coisa abstrata , ele não esta com o Datasheet aberto a sua frente.
Então o que ocorre ? Cria uma Variável para um único Bit Flag e desperdiça
um Byte da RAM a cada Flag.
Nâo estou me referindo aos Flags do Status de Máquina , C . Z . etc. me refiro assim
por exemplo em Contrôle:
Flag_S Sentido de Rotação
Flag_L Ligar Motor
Pois, é muito mais simples e eficiente, a tomada de decisão Lógica.
----------------------------------------------
" To be or not to be, that's the question"
(Shakespeare)
Traduzindo :
C ou não C ...![]()
Abraço Marcelo
union
{
unsigned char BYTE;
struct
{
unsigned char B7:1;
unsigned char B6:1;
unsigned char B5:1;
unsigned char B4:1;
unsigned char B3:1;
unsigned char B2:1;
unsigned char B1:1;
unsigned char B0:1;
} BIT;
} DATA;
RobL escreveu:Para ser mais econômico em tempo de CO2, pode usar Union envolvendo essa struct. Daí fica tudo em um único byte (8 flags em um byte).
Poderia ser também similar ao assembly, usando a diretiva #define para cada bit de um mesmo byte e setar, resetar por operações lógicas OR e AND. Usaria também um só byte para 8 flags. Gera o mesmo código que em assembly.
RobL escreveu:O que quero enfatizar, com Union envolvendo struct, em termos de economia, para os assemblystas( e os chiitas da Assemblyia of god) que acham que não se pode tratar bits em C (C suporta bit fields), é que através de uma Union envolvendo uma struct, conforme acima, podemos manipular vários bytes de flags (não apenas um byte como acima). usando um mesmo endereço de memória, um só (um byte 8 bits conforme definição acima char), desde que não sendo todos os bytes tratados ao mesmo tempo, é claro.
Cabe lembrar que pode-se manipular, definindo um int (2 bytes), com struct a parte alta e baixa(8 bits cada) com a mesma simplicidade que um byte com 8 bits em assembly, mas em assembly seria uma ginástica danada para fazer o mesmo.
Penso que no tópico. ficaram ricas informações a respeito dos mitos sobre C, especialmente tratamento de bits e outros.
Deixe a inteligência artificial do compilador agir em seu benefício e continue estudando o hardware de seu micro. O uso do compilador não significa encolher seu conhecimento.
Verdadeiramente compiladores são caros. Mas há os livres como o GCC.
Não vai dar para ir à guerra sem eles.
Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante