Uma das partes mais importantes de um processador são seus registradores. Nesta seção aprenderemos como programar esses registradores em linguagem assembly. No caso do raspberry PI4b, seu processador possui 31 registradores que podem executar instruções de 32 bits, bem como instruções de 64 bits.
Toda a eletrônica baseada em microcontroladores e processadores começou nas décadas de 1960 e 1970 com processadores baseados em registradores de 8 bits e 16 bits. Nas décadas de 1990 e 2000, a eletrônica passou a ser baseada em processadores com registradores de 32 bits. Já nas décadas de 2010 e 2020, começa o surgimento de microcontroladores e processadores com registradores de 64 bits. É o caso da placa Rasberry Pi4B, que possui um conjunto de instruções de 64 bits. O Raspberry Pi4B pode executar processamento de 32 bits e 64 bits.
Neste capítulo vamos focar nas instruções de 64 bits, pois são as que mais serão utilizadas no futuro. Isso se deve ao fato de que os sistemas eletrônicos exigem cada vez mais sensores com maior capacidade de processamento, tais como: sensores de impressões digitais, reconhecimento facial, análise de imagens, uso de câmeras, processamento de banco de dados, etc. inteligência artificial etc.
![](/images/stories/artigo2024/085106512024_144151_0002.png)
A imagem a seguir mostra a parte interna do processador ou cpu do Raspberry Pi4B. Observemos que dentro de suas partes mais importantes estão: memória de programa, memória de dados, registradores, unidades aritméticas e lógicas. Então neste capítulo veremos os registradores, conforme a imagem a seguir:
Para entender os registradores de 64 bits da placa Raspberry Pi4B, é necessário entender os de 8 bits, pois os de 64 bits são iguais, com a diferença de que podem armazenar mais informações. Na eletrônica digital existe um circuito chamado flip-flop tipo D ou dados, este circuito armazena informações após receber um pulso digital. A figura a seguir mostra um esquema deste circuito. O que este circuito faz é ler o nível lógico presente na entrada D e quando um pulso for recebido pela entrada Clock, armazená-lo na saída Q.
![](/images/stories/artigo2024/085106512024_144151_0004.png)
A figura a seguir mostra um exemplo do circuito, em um determinado estado, antes de receber um pulso na entrada Clock. Neste estado, a saída Q está na lógica 1 (alta) e a entrada na lógica 0 (baixa).
![](/images/stories/artigo2024/085106512024_144151_0005.png)
Agora, se dermos um pulso positivo (alto) na entrada Clock, o nível lógico presente na entrada D é armazenado no flip-flop e seu valor é apresentado na saída Q. Podemos ver isso na figura a seguir:
![](/images/stories/artigo2024/085106512024_144151_0006.png)
Agora, podemos formar um circuito que possui 8 flip-flops tipo D e o circuito é representado pela figura a seguir:
![](/images/stories/artigo2024/085106512024_144151_0007.png)
Temos 8 entradas D independentes e 8 saídas Q independentes. O Clock está em paralelo para todos os 8 flip-flops. A operação é exatamente a mesma para todos os 8 flip-flops, conforme explicado acima para um único flip-flop. Este tipo de circuito é chamado de registrador. A figura a seguir mostra um exemplo de um possível estado deste circuito, antes de receber um pulso através da entrada Clock.
![](/images/stories/artigo2024/085106512024_144151_0008.png)
A figura a seguir mostra o circuito após receber um pulso positivo na entrada Clock. Os valores são armazenados nas saídas Q.
![](/images/stories/artigo2024/085106512024_144151_0009.png)
Assim, podemos armazenar dados ou informações digitais. Existem vários circuitos digitais que incorporam vários flip-flops e seguem a operação explicada anteriormente.
Para formar um conjunto de registradores, podemos juntar vários flip-flops, dispostos conforme a figura a seguir.
![](/images/stories/artigo2024/085106512024_144151_0010.png)
Os dados são colocados nas entradas D0, D1, D2, D3, D4, D5, D6, D7. Os dados são armazenados no respectivo grupo de flip-flops e exibidos ou emitidos pelas saídas Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7. Graças ao fato de todas as saídas Q estarem em alta impedância, ou seja, uma alta resistência, não há problemas com curto-circuito e apenas o registro selecionado estará presente nas saídas Q. Assim, podemos formar um conjunto de registros . No caso do Raspberry PiB4, temos um conjunto de 31 registradores de 64 bits.
Assim, conforme foi estudado, a base dos registradores em qualquer microprocessador ou microcontrolador é o circuito: “flip-flop”:
![](/images/stories/artigo2024/085106512024_144151_0011.png)
Mas em livros e manuais eletrônicos, a representação do flip-flop é resumida como uma caixa quadrada conforme a imagem a seguir:
![](/images/stories/artigo2024/085106512024_144151_0012.png)
Esta representação permite resumir os desenhos e esquemas quando nos referimos a registradores em um processador. A figura a seguir mostra dois “flip-flops” e suas respectivas representações simplificadas:
![](/images/stories/artigo2024/085106512024_144151_0014.png)
A figura a seguir mostra um registrador de 8 “flip-flops”, em sua representação resumida:
![](/images/stories/artigo2024/085106512024_144151_0015.png)
A figura a seguir mostra um registro de 64 flip-flops, em sua representação resumida:
Podemos ver que o registrador tem 64 flip-flops. Normalmente, eles são chamados de registradores de 64 bits e recebem um peso ou valor aritmético da esquerda para a direita, conforme mostrado na figura a seguir:
Para melhor manuseio na hora de ler ou escrever valores binários em um registrador de 64 bits, estes são divididos em “nibbles”. Um “nibble” equivale a 4 bits, conforme figura a seguir:
O processador BCM2711 possui 31 registradores de 64 bits. A figura a seguir mostra todos esses registradores com seus respectivos “flip-flops” resumidos:
É importante observar que o primeiro "flip-flop" ou bit, que fica do lado direito da imagem, ocupa a posição "0" e o último bit a posição 63. Observe a imagem a seguir onde os registradores foram divididos em nibbles:
Na prática, é desconfortável trabalhar com números binários de 64 bits, pois é difícil saber exatamente em que posição um bit está ao ser escrito em um editor, por isso os nibbles de um registrador de 64 bits são escritos em notação: “hexadecimal”. Os valores hexadecimais são: “0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F”. A figura a seguir mostra os valores binários e seus respectivos valores em hexadecimal:
![](/images/stories/artigo2024/085106512024_144151_0021.png)
É preciso se acostumar com essa tabela, pois, apesar de ser muito simples de entender, ela é muito utilizada em sistemas eletrônicos e de informática.
SIMULANDO AS INSTRUÇÕES PARA REGISTROS NO SIMULADOR GRÁFICO.
Conforme visto no capítulo anterior, vá até a pasta ou cole onde está localizado o simulador e execute-o em um navegador conforme a imagem a seguir:
No editor vamos escrever as instruções. A primeira instrução que é necessário aprender é:
Mova um valor para um determinado registro.
Isso é feito com a instrução:
MOVZ
Seguido pelo Registro. Os registros variam de:
X0 a X27
Seguido do valor que você deseja armazenar no registro. Para valores em hexadecimal é necessário colocar: “0x”. Por exemplo:
0x3F
Uma instrução completa para mover ou armazenar um valor em um registrador seria:
MOVZ X1.0x3F
Obs: é necessário separar o nome do registro e o valor a ser armazenado, por vírgula “,”.
Com essas informações, já podemos começar a escrever as instruções em assembler, no editor do simulador. Para começar, vamos escrever a instrução acima mencionada e executá-la. Escreva a instrução no editor conforme mostrado na figura a seguir:
Depois que a instrução é escrita, é necessário montar a instrução. Para isso, pressione o botão: “Montar”, conforme a imagem a seguir:
Por fim, pressione o botão: "Execute Instruction", conforme a imagem a seguir:
Agora podemos observar as mudanças nos registros. Observe a seguinte imagem:
Como podemos ver, o registrador X1 é carregado com o valor: 0x3f.
Vamos fazer outro exemplo:
Armazena no registrador: X1 o valor: 0X3F e armazena no registrador: X5 o valor: 0X21.
Para isso escreva as instruções conforme a imagem a seguir:
Monte e observe os resultados no conjunto de registros conforme mostrado na imagem a seguir:
Agora, no editor, vamos escrever a instrução para:
Mover um registro para outro registro.
Isso é feito com a instrução:
MOV
Seguido do registro que receberá o valor. Os registros variam de:
X0 a X27
Seguido do registrador que retornará o valor. Os registros variam de:
X0 a X27
Uma instrução completa para mover um registro para outro seria:
MOVZ X1, X3
Esta instrução diz: copie o conteúdo do registrador X3 para o registrador X1. Obs: é necessário separar os nomes dos registros, por vírgula “,”.
Vamos fazer um exemplo com esta instrução. Vamos passar para o registrador X6 o valor: 0XC7. Então, vamos passar para o registrador X3 o valor: 0X72. Então vamos mover o valor do registrador X3 para o registrador X1. O programa em assemble seria o seguinte:
Observe os resultados no simulador:
Conclusão
Podemos notar que escrever instruções nos registradores do processador do Raspberry Pi4B é relativamente simples. Muitas possibilidades podem ser experimentadas no simulador em relação aos seus registros. As instruções para mover valores para registradores e mover registradores para registradores são muito utilizadas em programação e eletrônica, pois como veremos adiante, as portas de entrada/saída do Raspberry Pi4B são muito parecidas com registradores.