Ir ao conteúdo
  • Cadastre-se

Assembly calculadora com o Neander


Posts recomendados

Boa tarde, Gente, preciso fazer um calculadora com 4 operações com o novo neander, "NeanderWin", porém, estou muito perdido, não consigo encontrar nada na internet, alguém poderia me dar uma ideia de como começar, por favor? Não sei se eu não procurei direito ou esse novo neander é mais chatinho mesmo..  Desde já, agradeço.. 

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

@EduhMarques    o neander é um processador bem simples, ele tem apenas 256 bytes de memória  e 15 instruções que são essas :

   Instrução         Descrição
      NOP        nenhuma operação
      STA ender  armazena acumulador (store)
      LDA ender  carrega acumulador (load)
      ADD ender  Soma
      OR ender   operação lógica “ou”
      AND ender  operação lógica “e”
      NOT        Inverte (complementa) acumulador
      JMP ender  desvio incondicional (jump)
      JN ender   desvio condicional (jump on negative)
      JZ ender   desvio condicional (jump on zero)
      JNZ ender  desvio condicional (jump on not zero)
      IN ender   operação  de entrada no dispositivo “ender”
      OUT ender  operação de saída no dispositivo “ender”
      LDI imed   carrega o valor imediato imed no acumulador
      HLT        término da execução (halt)

    no editor do neander coloque a variável e em seguida coloca EQU e o endereço, que pode ser qualquer um de zero até 255, mas o melhor e mais comum é colocar a partir do endereço 128, pois a parte inicial é onde será colocado os códigos depois de compilados, pois o texto precisa ser compilado para funcionar, e para compilar clique no botão compilar, cada variável em um endereço, depois coloque o comando " ORG 0 " para organizar tudo, para entrar um valor use o teclado  ( um quadrado branco com oito bolinhas vermelhas )  que são bits de um byte, a seta  para cima é 1 e para baixo é zero, clicando no bit a setinha vira para cima ou para baixo, e no código coloque o comando IN 0  para que ele leia o valor, e o melhor para é clicando no botão passo a passo , pois se for em executar ele passa direto e não para e nem dá tempo para colocar o valor que se quer, e na hora que chegar no comando IN 0 vá no teclado e coloque o valor que quer e clique no botão ENTRAR e depois continue clicando no botão PASSO A PASSO,   para ver o resultado que está no acumulador " A " coloque o comando OUT 0 e irá aparecer no viso do programa, e para colocar um valor em uma variável, que é um endereço de memória, use o comando STA NOME_DA_VARIÁVEL, e para somar use o comando LDA NOME_DA_VARIÁVEL onde está o primeiro valor e depois coloque o comando ADD NOME_DA_VARIÁVEL onde está o segundo valor a ser somado, com isso o resultado estará armazenado no acumulador " A " e poderá ser visto no visor usando o comando OUT 0,  depois que fizer tudo o que precisar então finalize o programa usando o comando HLT.

      na janela do lado direito estão todos os conteúdos dos 256 bytes de memória do programa, e em cima dessa janela são mostrados os comados em mnemônicos do código que foi escrito, PC é o endereço em hexadecimal que a instrução está,

ACC é o valor que está no acumulador " A " ,  

Z é o FLAG  zero, na hora que fizer comparação se Z estiver setado é porque é igual, senão é porque não é igual,   N é igual ao Z  porém verifica se é maior ou menor. 

    e embaixo do lado direito no quadrado de endereço pode ser colocado um valor de zero ate 255, a partir de onde será  inserido os códigos do programa escrito, assim que clicar no botão compilar.
  aqui um texto de um código para exemplo, copie e cole no editor do neander depois vá clicando no botão passo a passo : 

;---------------------------------------------------
; Programa:  soma dois valores
; Autor:
; Data:   
;---------------------------------------------------
X EQU 128  ; Endereço da variável X definido como 128
Y EQU 129  ; Endereço da variável Y definido como 129

ORG 0   ; organiza tudo
IN 0    ; le o teclado, o zero não pode ser mudado e coloca o valor no acumulador A
STA X   ; guarda o valor que está no acumulador A na variável X
IN 0    ; le o teclado, o zero não pode ser mudado e coloca o valor no acumulador A
STA Y   ; guarda o valor que está no acumulador A na variável Y
LDA X   ; acumulador A recebe conteúdo de X
ADD Y   ; conteúdo de A é somado ao conteúdo de Y
OUT 0   ; mostra o resultado, que está no acumulador, no visor,não pode mudar o zero 
HLT     ; processador pára e finaliza o programa 

 

Link para o comentário
Compartilhar em outros sites

  • 2 anos depois...

@Jonathas Braun     são muitos exercícios , faça um de cada vez e poste aqui , assim podemos ajudar , 

     e para comparar duas variáveis , usa se a flag z , e para isso carregue o Acumulador A com o valor de uma variável que já esteja preenchida  e subtraia a outra variável com o comando sub variavel , aí se forem iguais o resultado da operação será igual a zero , pois por exemplo se a = 10 e b = 10 , então a - b = 0 ,  com isso a flag z será setada , o que quer dizer que ela receberá o valor 1 , e se não for igual a zero receberá o valor zero , aí use o jump z ( JZ )  para pular para um endereço de Label para fazer alguma coisa que informe o resultado obtido ,  por exemplo pegar o valor de um endereço , que já esteja preenchido antecipadamente , com um valor , tipo 1 para igual e dois para diferentes .

Link para o comentário
Compartilhar em outros sites

@Jonathas Braun    então esse neander aqui

31727656_neanderx.jpg.ea0a9f5b937c819188deddc1eb4f8c06.jpg

  esse é mais antigo e tem menos comandos , tornado se mais difícil , pois para comparar nele precisa  criar uma mascara com a instrução not e depois usar a instrução add para afetar a flag z ,  e assim saber se é igual ou diferente , e também  a flag N para saber se é maior ou menor . pois N de Negatve  , negativo é 1 positivo é zero .

Link para o comentário
Compartilhar em outros sites

@jonathas braun    creio que não , pois ali foi você mesmo quem decidiu o resultado , e é preciso que o próprio programa decida , então isso seria feito por comparações .

    e um modo de fazer comparações nesse neander , seria criando uma máscara para tal valor ,  por inverter todos os bits dele e adicionar o valor hum , e depois para comparar , pegue o valor e adicione a máscara criada à esse valor , assim se a flag n , de negativo , estiver setada, que é o mesmo que ter o valor 1 ,  é porque é negativo e se a flag z , de zero volts , estiver setada é porque é zero e se nem n nem z estiverem setadas é porque é positivo  , mas tentei colocar um valor negativo e não consegui , então precisamos pesquisar sobre isso  depois , para ver como fica .

e o exercício 4 pode feito de vários modos e também pode ser assim :

informações adicionais :
suspeita se que a variável a seja o endereço  128
imagine     que a variável b seja o endereço  129
pode crer   que a variável r seja o endereço  130
então :
clique na área de dados no endereço 128 e embaixo no quadro coloque o valor que quiser para a variável a
o mesmo para a variável b  endereço 129
e também no endereço 250 coloque o valor 01 ( hum )

insira a listagem da esquerda , que são os mnemônicos .

informações adicionais :
suspeita se que a variável a seja o endereço  128
imagine     que a variável b seja o endereço  129
pode crer   que a variável r seja o endereço  130
então :
clique na área de dados no endereço 128 e embaixo no quadro coloque o valor que quiser para a variável a
o mesmo para a variável b  endereço 129
e também no endereço 250 coloque o valor 01 ( hum )
            
            ; ô programa

lda 129     ; carrega o valor da fictícia veriável b end 129
not         ; inverte todos os bits de b
add 250     ; adiciona o valor 01 ( hum ) ao acumulador
            ; acumuladr tem a mascara de b
sta 251     ; armazena a mascara de b nesse endereço
            ; simulando a comparação
lda 128     ; carrega o valor da imaginada variável a end 128
add 251     ; adição de a com mascara de b
jn l1       ; se a for menor que b pula para o label l1
            ; fim da comparação
            ; se bão pulou então ficou e aqui outra comparação
            ; para ver se as duas variáveis são iguais
lda 128     ; recupera o valor de a
add 251     ; adição de a com mascara de b
jz fim      ; se a for igual a b 
            ; então não precisa fazer nada e
            ; então pula para o final do programa
            ; fim dessa outra comparação
            ; se não pulou , ficou , significando que não são iguais
lda 128     ; então recupera o valor de a
jmp print   ; pula para o endereço do print

;l1:        ; label l1
            ; se chegou até aqui é porque b é maior que a
lda 129     ; então recupera o valor de b , carregando ele no acumulador

;print:     ; label do print
sta 129     ; esse é o print , armazena o valor do acumulador nesse endereço r

;fim:       ; final mesmo
hlt         ; instrução de finalização de programa

 

241496914_IMAGEMCDIGONEANDERX.thumb.jpg.2aacea4f2f9d06a50228ed90095d7d46.jpg

 

 

Link para o comentário
Compartilhar em outros sites

@devair1010 aquela 9 tu tem uma noção de como faz?

adicionado 13 minutos depois
52 minutos atrás, devair1010 disse:

@Jonathas Braun    creio que não , pois ali foi você mesmo quem decidiu o resultado , e é preciso que o próprio programa decida , então isso seria feito por comparações .

    e um modo de fazer comparações nesse neander , seria criando uma máscara para tal valor ,  por inverter todos os bits dele e adicionar o valor hum , e depois para comparar , pegue o valor e adicione a máscara criada à esse valor , assim se a flag n , de negativo , estiver setada, que é o mesmo que ter o valor 1 ,  é porque é negativo e se a flag z , de zero volts , estiver setada é porque é zero e se nem n nem z estiverem setadas é porque é positivo  , mas tentei colocar um valor negativo e não consegui , então precisamos pesquisar sobre isso  depois , para ver como fica .

e o exercício 4 pode feito de vários modos e também pode ser assim :


INFORMAÇÕES ADICIONAIS :
SUSPEITA SE QUE A VARIÁVEL A SEJA O ENDEREÇO  128
IMAGINE     QUE A VARIÁVEL B SEJA O ENDEREÇO  129
PODE CRER   QUE A VARIÁVEL R SEJA O ENDEREÇO  130
ENTÃO :
CLIQUE NA ÁREA DE DADOS NO ENDEREÇO 128 E EMBAIXO NO QUADRO COLOQUE O VALOR QUE QUISER PARA A VARIÁVEL A
O MESMO PARA A VARIÁVEL B  ENDEREÇO 129
E TAMBÉM NO ENDEREÇO 250 COLOQUE O VALOR 01 ( HUM )

insira a listagem da esquerda , que são os Mnemônicos .

 

241496914_IMAGEMCDIGONEANDERX.thumb.jpg.2aacea4f2f9d06a50228ed90095d7d46.jpg

 

 

E como assim criar uma máscara?

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

@Jonathas Braun    o quadrado de um número positivo , é igual a soma dele com ele mesmo a quantidade de vezes dele , então , criar um Loop , por colocar um valor em um endereço e ir decrementando esse valor por subtrair o valor hum dele , até que se chegue ao valor zero , e para saber se chegou a zer , use comparação ,  e dentro desse Loop , vai adicionando o número com ele mesmo com a instrução ADD endereço , assim no final o Acumulador conterá o valor da multiplicação . aí coloque na posição de memória seguinte ao número .  faça e posta aqui , para ajudarmos   .

Link para o comentário
Compartilhar em outros sites

12 horas atrás, Jonathas Braun disse:

questao:Faça um programa que leia um número armazenado na posição 128. Se este valor é 0, o armazene no  endereço 130, se for negativo, o armazene no endereço 131 e caso seja positivo o armazene no endereço 132. 

 

ta certo?

8.png

Agora ta certo?

8.png

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

@Jonathas Braun    melhorou , mas ainda não , pois você mesmo decidiu o resultado ,  sem que o próprio programa decida isso , e a mascara seria um valor que somado ao valor que se quer testar tenha como resultado o valor zero , pois assim o programa saberá se o número testado é ou não igual ou maior ou menor que o outro , pois se a soma for  igual a zero a flag Z estará com o valor 1 e se for diferente terá o valor 0 , o mesmo para a flag N , então veja nessa imagem abaixo se consegue entender como funciona , e é claro que existe muitas outras formas de se fazer isso  :

 

494704733_MASCARADEBITS.thumb.JPG.bd8d1ffad7d4d7565cd560d8d45c73ce.JPG

 

depois vou tentar fazer esse que você postou e coloco ele aqui  .

Link para o comentário
Compartilhar em outros sites

@Jonathas Braun    como eu disse acima ,  você usa a instrução   ADD , para somar um número com outro número , e isso afeta as flag's  ,  e então você pode aproveitar isso para que de acordo com o estado de uma determinada flag , o programa faça algo que você queira  , mais tarde tentarei corrigir seu código acima e  posto .

Link para o comentário
Compartilhar em outros sites

@Jonathas Braun     seu código desse exercício acima , com algumas modificações poderia ser assim  :

CONSIDERAÇÕES INICIAIS:
COLOQUE NESSES ENDEREÇOS ESSES VALORES
140 = 01
141 = 00
128 = um número qualquer , de 0 até 255 , que você queira 

LDA 128   ; carrega a Acumulador com o conteúdo do end. 128
ADD 141   ; soma com o valor zero que está no end. 141 ( simula uma comparação )
          ; do que está no Acumulador , com o conteúdo do ender. 141 que é zero
JZ L1     ; se Z igual a 1 , vai para o Label L1
LDA 128   ; carrega o valor do end. 128 no Acumulador
NOT       ; inverte todos os bits do número
ADD 140   ; soma o número com o valor de end. 140 que é 1
STA 150   ; isso é a MASCARA , armazene ela no end. 150
LDA 128   ; carrega o conteúdo do end. 128 no Acumulador
ADD 150   ; soma o Acumulador com o conteúdo do end. 150 que é a máscara  ( simula uma comparação )
JN L2     ; se a flag N estiver setada ( igual a 1 ) pula para esse Label L2
          ; se ficou então não é igual a zero nem negativo só pode ser positivo
lda 128   ; pega o número no end. 128
STA 132   ; e cloca no endereço 132
HLT       ; termina o programa

L1:       ; aqui o Label L1
LDA 128   ; carrega o conteúdo do end. 128
STA 130   ; armazena o conteúdo do Acumulador no end. 130
HLT       ; termina o programa

L2:       ; aqui o Label L2
LDA 128   ; carrega o conteúdo de end. 128 no Acumulador
STA 131   ; armazena o conteúdo do Acumulador no end. 131
HLT       ; termina o programa

ou apenas esses números nesses endereços :

-------------------
endereço  |  valor
----------|--------
  0       |   32
----------|--------
  1 	  |   128
----------|--------
  2 	  |    48
----------|--------
  3 	  |   141
----------|--------
  4 	  |   160
----------|--------
  5 	  |    24
----------|--------
  6 	  |    32
----------|--------
  7 	  |   128
----------|--------
  8 	  |    96
----------|--------
  9 	  |    48
----------|--------
 10 	  |   140
----------|--------
 11 	  |    16
----------|--------
 12 	  |   150
----------|--------
 13 	  |    32
----------|--------
 14 	  |   128
----------|--------
 15 	  |    48
----------|--------
 16 	  |   150
----------|-------- 
 17 	  |   144
----------|--------
 18 	  |    29
----------|--------
 19 	  |    32
----------|--------
 20 	  |   128
----------|--------
 21 	  |    16
----------|--------
 22 	  |   132
----------|--------
 23 	  |   240
----------|--------
 24 	  |    32
----------|--------
 25 	  |   128
----------|--------
 26 	  |    16
----------|--------
 27 	  |   130
----------|--------
 28 	  |   240
----------|--------
 29  	  |    32
----------|--------
 30 	  |   128
----------|--------
 31 	  |    16
----------|--------
 32 	  |   131
----------|--------
 33 	  |   240
-------------------

 

Link para o comentário
Compartilhar em outros sites

@Jonathas Braun    Label é o nome que se dá a hum bloco de comandos de um programa , em suma o que isso significa é que se o programa decidir alguma coisa ele pula para o endereço onde esse bloco de instruções está armazenado e passa a executar as instruções dali em diante ; e ali o Label L2 é porque comparou o número com aquela máscara e viu que o número é negativo , e pula para esse Label L2 .

Link para o comentário
Compartilhar em outros sites

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!