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.
fonte
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
oux:=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, podeh1
ser um nome de variável de entrada?Respostas:
Perl 5: 948, código 355 + saída 593
Depois de jogar golfe. A versão mais curta anterior não foi analisada corretamente
(a+b)-4*c
.Exemplo de uso:
fonte