WinAli é um montador de modelos para Windows. Emula uma CPU real e destina-se a ajudar os alunos a aprender e entender a linguagem Assembly.
Artigo alemão da Wikipedia: http://de.wikipedia.org/wiki/WinAli (não há artigo em inglês no momento)
Caso você queira testar sua saída produzida: Link para o Google Drive (o programa em si é em alemão, mas é fácil de usar, mesmo se você não entender alemão)
Algumas informações sobre o WinAli (dados e sintaxe)
Tipos de dados:O único tipo de dados no WinAli é um "Inteiro" de 2 bytes de comprimento, que é de fato um Smallint ou curto . Portanto, você não precisa cuidar dos tipos corretos. Isso também é arredondado ao dividir.
Variáveis e constantes:Variáveis são definidas assim após os comandos:
name DS F
- nome é obviamente o nome da variável
- DS é a palavra-chave para uma nova variável
- F define o comprimento da variável em bits; isso é baseado em zero e hexadecimal, então F = 16 bits
As constantes são muito semelhantes:
name DC value
- nome é simplesmente o nome da constante
- DC é a palavra-chave para uma nova constante
- value é o valor atribuído a essa constante, por exemplo
two DC '2'
- Você não precisa especificar constantes no final do código. Você também pode escrevê-los em linha com a
LDA
operação (carregar), por exemploLDA 0,'2'
. Isso carrega "2" no registro 0 (o acumulador).
O código está alinhado em 4 colunas separadas por um espaço ou tabulação:
label command params comment
- label é usado para o
b label
comando (goto label
) e geralmente é ignorado. - comando um dos comandos listados abaixo.
- modela um ou dois parâmetros com pelo menos um registro e, se necessário, outro registro, variável, pilha ou endereço; esses parâmetros são separados por vírgula (
,
). - comentários (opcional) um comentário prefixado com
;
ou*
até o final da linha.
Referência de código pequeno:
Existem mais comandos, mas para esse desafio você precisa apenas desses:
INI A
Armazena a próxima entrada do usuário na variávelA
OUTI A
Emite o valor que a variávelA
está mantendo. Você não pode usar um registro aqui por algum motivo.LDA 0,A
Carrega o valor deA
no registro 0STA 0,A
Armazena o valor do registro 0 na variávelA
ADD 0,A
Adiciona o valor deA
ao valor do registro 0SUB 0,A
Multiplica o valor deA
com o valor do registro 0DIV 0,A
Divide o valor deA
pelo valor do registro 0EOJ
Define o final do trabalho, ou seja, código executável. Declarações variáveis e constantes começam após esta marca.
Não é explicitamente necessário para este desafio:
program START 0
Define o primeiro endereço a ser executado como 0, ou seja, a próxima linha (program
é apenas o nome do programa, mas é necessário para o compilador)END program
Finaliza o programa, ou seja, para de executar, mesmo que outras operações sigam
O seu desafio!
Escreva um programa ou script que obtenha uma expressão matemática com números e variáveis constantes e produz o código WinAli que utiliza todas as variáveis como entrada e gera o resultado dessa expressão.
- Você não precisa emitir os comandos
START
eEND
- Embora existam 16 registros definidos no WinAli, usamos apenas o registro 0, que é o acumulador para todos os cálculos
- Você não pode usar duas variáveis como parâmetros de um comando. Você precisa salvar todos os seus resultados no acumulador (registro 0)
- A entrada está sempre na forma de um
x:=(a+b)/c
ou simplesmente(a+b)/c
, você decide - Você só precisa cuidar
+ - * / (ADD, SUB, MUL, DIV)
, portanto, não há cálculos complexos como raízes, quadrados ou até mesmo sinusite - Dica: Tente primeiro extrair expressões simples com apenas 2 argumentos, por exemplo
a:=a+b
,x:=a/c
- Dica: Seu programa poderá usar variáveis adicionais (auxiliares) se você não puder sobrescrever variáveis que não serão usadas posteriormente no seu código. Defina-os como
h1 DS F
. - Dica: Linhas vazias são inúteis. Tente evitá-los. (Você realmente não precisa deles)
Exemplo:
Expressão matemática: x: = (a + b) * c Saída esperada (linhas vazias são para facilitar a leitura): INI a INI b INI c LDA 0, um ADICIONAR 0, b MUL 0, c STA 0, a OUTI a EOJ um DS F b DS F c DS F
Pontuação:
Sua pontuação é definida pelo comprimento do seu código + o comprimento da saída das seguintes expressões:
x:=a+b+c*c/d
x:=(a+b)/c-d
x:=a-b*c-d/e
x:=2*a-b*c+d
- -10% se o seu código puder lidar com menos unário em expressões.
Em caso de empate, a resposta que produz o menor código WinAli em funcionamento vence.
As soluções não podem ser codificadas de forma alguma. Validarei cada resposta com expressões adicionais para garantir que sua resposta esteja correta.
MUL 0,-a
? isso não é possível porque não há endereços negativos ( a
é apenas um ponteiro para um valor), mas você pode subtrair o valor de 0 para obter a representação negativa ( SUB 0,a
) e trabalhar com esse valor negativo; você pode até armazenar isso na variável original.
x:=-a*b
ou x:=a/-(b+c)
. Como a ordem de entrada não está especificada, acho que precisamos usar os mesmos nomes de variáveis no código WinAli, é esse o caso? Com essas restrições, existem identificadores que nunca estão na entrada? Por exemplo, pode h1
ser um nome de variável de entrada?