Little Man Computer

[PTBR Documentation](/LMC/README-PTBR/) | Simulador | [Commands](#commands-and-structure)

Objetivo

  • O Little Man Computer (LMC) fornece um modelo simplificado de um computador, tornando-se uma ferramenta de ensino de fácil compreensão para estudantes de ciência da computação e programação.

  • Ao trabalhar com o LMC, os alunos adquirem uma compreensão mais profunda da arquitetura de computadores e dos conceitos básicos de pipeline, que são conceitos fundamentais na ciência da computação.

  • A abordagem prática de programação com o LMC proporciona experiência prática que pode ser aplicada no projeto e otimização de sistemas computacionais do mundo real.

Sobre nós

Nós somos estudantes de Ciência da Computação do terceiro semestre na Pontifícia Universidade Católica do Paraná (PUCPR). Este projeto foi um desafio proposto pelo professor Frank de Alcântara na disciplina de Desempenho em Sistemas Ciberfísicos.

Comandos e Estrutura

Programando para o LMC

Os códigos para o Computador do Homem Pequeno são um conjunto de instruções simples que simulam as instruções de um computador real. O LMC possui um acumulador que mantém um valor para operações.

Aqui estão alguns exemplos simples de códigos para o LMC que utilizam a maioria de suas características.

Este código recebe uma entrada e conta de forma decrescente até 0.

	INP
loop	OUT
	STA count
	SUB one
	STA count
	BRP loop
	HLT

one     DAT 1
count	DAT

Esse codigo soma os dois numeros dados.

	INP
	STA	number     
	INP     
	ADD	number
	OUT
	HLT

number	DAT

Rótulos

Rótulos podem ser usados para aumentar a complexidade do código, aplicar condições ou loops. Para criar um rótulo, digite qualquer nome seguido por “:” e o primeiro comando que deve ser executado ao pular para o rótulo.

Criando rótulos

#Label named "label1"
label1    OUT
          HLT

#Label named "label2"
label2    HLT

#Label named "anyname"
anyname   INP
          HLT

Para pular para um determinado rótulo, utilize comandos jump.

Todos os Comandos

* [Input](#input) * [Output](#output) * [Halt](#halt) * [Add](#add) * [Subtract](#subtract) * [Jumps](#jumps) * [Store](#store) * [Load](#load) * [Dat](#dat)

Input

Comando: INP

OPCODE: 901

Pegará a próxima entrada do usuário e a adicionará ao acumulador. Se não houver mais entradas, o valor adicionado ao acumulador será 0.

Uso

# User input: 1 | 2 | 3

  INP

# User input: 1 | 2
# Accumulator: 3

Output

Comando: OUT

OPCODE: 902

Adicionará à lista de saída o valor do acumulador

Uso

# Output: 2 | 3
# Accumulator: 1

  OUT
  
# Output: 1 | 2 | 3

Add

Comando: ADD [ pos ]

OPCODE: 1xx

Adicionará ao acumulador o valor localizado na posição especificada.

Uso

# Accumulator: 2
# Value at postion 3: 5

  ADD 3
  
# Accumulator: 7

Subtract

Comando: SUB [ pos ]

OPCODE: 2xx

Subtrairá do acumulador o valor localizado na posição especificada.

Uso

# Accumulator: 7
# Value at postion 3: 5

  SUB 3
  
# Accumulator: 2

Load

Comando: LDA [ pos ]

OPCODE: 5xx

Carregará o valor dentro de um slot de RAM para o acumulador.

Uso

# Value at position 3: 5

  LDA 3
  
# Accumulator: 5

Store

Comando: STA [ pos ]

OPCODE: 3xx

Armazenará o valor atual do acumulador na posição de RAM especificada.

Uso

# Accumulator: 2

  STA 3
  
# Valor na posição 3: 2

Dat

Comando: [ nome ] DAT (opcional: [ valor ])

OPCODE: Nenhum

Nomeará um Slot de RAM. Este comando não é executado quando o código está rodando, apenas antes, quando carregando o código para a RAM. É possível passar um valor inicial. Este comando deve ser adicionado APÓS o fim do código.

Uso

x DAT
y DAT 12

# No primeiro espaço livre apos os comandos: espaço RAM chamado x, valor: 000
# No segundo espaço livre apos os comandos: espaço RAM chamado y, valor: 12

Ao usar DAT, os comandos aceitam o nome da posição

      LDA x
      STA y
      ADD z
      SUB name

x     DAT
y     DAT
z     DAT 1
name  DAT 3

Jumps

Existem três tipos de saltos. Todos os saltos irão para o rótulo especificado se as condições forem cumpridas.

Branch Always

Comando: BRA [ Rótulo ]

OPCODE: 6xx

Sempre ramificará para o rótulo especificado

Uso

      BRA exit

exit  HLT

Branch If Positive

Comando: BRP [ Rótulo ]

OPCODE: 8xx

Só ramificará para o rótulo especificado se o valor do acumulador for positivo.

Uso

# Accumulator value: 1
      BRP exit

exit  HLT

Branch if Zero

Comando: BRZ [ Rótulo ]

OPCODE: 7xx

Só ramificará para o rótulo especificado se o valor do acumulador for positivo.

Uso

# Accumulator value: 0
      BRZ exit

exit  HLT

Halt

Comando: HLT

OPCODE: 000

Parará a execução do código.