Na minha infância, costumava programar em uma calculadora soviética MK-61 . Tinha quatro registros operacionais (X, Y, Z, T) e 15 registros de armazenamento. Um programa pode ter 105 etapas.
Pelo que me lembro, tinha comandos como:
- Troque os registros X e Y
- Registros de deslocamento (Z a T, Y a Z, X a Y)
- Copiar do registro de armazenamento (1..15) para X
- Copiar de X para o registro de armazenamento (1..15)
- Se X <0, vá para a etapa do programa ##
- Execute a operação (+, -, *, /) usando os valores X e Y e coloque o resultado em X
Este comando define uma linguagem assembly? Eu tive uma idéia básica de linguagens assembly usando este dispositivo?
Acontece que é algo chamado "programação de teclas" .
Fato engraçado: uma calculadora semelhante (como esta, mas com memória independente de energia) foi usada como hardware de backup para os cálculos da trajetória das missões espaciais em 1988. :-)
programming-languages
assembly
defhlt
fonte
fonte
Respostas:
Esta não é uma linguagem assembly, é uma linguagem de máquina.
Linguagem de máquina é qualquer coisa que fisicamente signifique algo para a máquina. No caso de computadores de bolso, são as teclas pressionadas, codificadas em números na máquina. Você não fornece mais informações sobre esta máquina Electronika MK61 , por isso darei o exemplo da TI-57 : a linguagem da máquina usou o número da chave fornecida como coluna nas dezenas e na linha nas unidades. Então, por exemplo, um programa que aumentaria a memória 8 seria:
Esta é a linguagem da máquina: é o que é diretamente interpretado pela máquina.
A linguagem assembly seria o texto legível por humanos :
Para transformar esse texto na sequência de códigos de máquina, você precisaria de um montador , que pode ser um programa, ou um humano que traduziria esse texto na sequência de números.
A confusão geralmente é feita, porque geralmente existe uma tradução direta da linguagem assembly para a linguagem de máquina, mas essa nem sempre é uma tradução totalmente direta: os assemblies de macro possuem macros poderosas que podem fazer muito trabalho no assembler e gerar um muitas instruções de linguagem de máquina de uma única instrução de montagem. A mera tradução de endereços simbólicos pode envolver a alteração do código operacional das instruções de ramificação (por exemplo, ao mudar de endereço relativo curto para endereço relativo ou absoluto longo), portanto nem sempre é tão direto quanto você imagina.
fonte
Eu diria que a resposta para ambas as partes da sua pergunta é não: os comandos desta calculadora não são como a linguagem assembly, e a programação dessa calculadora é diferente da programação na linguagem assembly.
O "idioma" em que esta calculadora está programada é de nível bastante baixo, mas ainda representa uma abstração sobre construções de nível inferior que não são visíveis para você como programador. Acho que sim, mas pela sua descrição e pela observação do teclado (e comparando-o com calculadoras de aparência semelhante da Hewlett Packard ou Texas Instruments do final da década de 1970 e início da década de 1980), eu diria que cada etapa do programa "não só poderia ser uma operação simples como" adicionar "ou" trocar X e Y ", mas também operações mais complexas como trigonometria, exponenciação, logaritmos, etc. Cada uma dessas etapas provavelmente é implementada como uma rotina interna de microcodificação. Esse microcódigo provavelmente está programado em linguagem assembly, mas acho que não '
Como outros já descreveram, a linguagem assembly geralmente está em uma correspondência muito próxima (se não 1: 1) com as instalações da máquina subjacente. Eu diria que a programação em linguagem assembly inclui as seguintes características que provavelmente não estão presentes na programação desta calculadora.
As operações incluem operações de nível inferior, como AND, OR, XOR, bit a bit; aritmética de número inteiro e (talvez) de ponto flutuante, em uma variedade de tamanhos de dados (por exemplo, precisão simples ou dupla); carga / armazenamento de vários tamanhos (byte, meia palavra, palavra etc.).
Operações de nível superior (trig, logaritmos) são geralmente chamadas de sub-rotina, não instruções. Existem algumas exceções, como o DEC VAX, que possuía uma instrução de avaliação polinomial. [Edit: OP apontou que o x87 também possui funções trigonométricas.]
O esquema de endereçamento da máquina está exposto. Se o espaço de endereço for segmentado, você precisará carregar um endereço base em um registro e, em seguida, o código ou dados de endereço relativos a esse registro. Mesmo com um espaço de endereço plano, você está ciente dos endereços e da aritmética dos endereços. Normalmente, os montadores permitem que os programadores usem etiquetas para indicar endereços. Mas se um endereço estiver em um segmento diferente, talvez você precise carregar um registro de segmento antes de poder acessá-lo.
O alinhamento da memória está exposto. Por exemplo, em muitas máquinas, uma palavra de 4 bytes só pode ser carregada ou armazenada em endereços com múltiplos de 4 bytes.
A representação de dados está exposta. Geralmente, os montadores fornecem uma maneira de especificar dados numéricos em hexadecimal, octal, decimal, ponto flutuante e, ocasionalmente, dados de caracteres.
A especialização de registros é exposta. Algumas arquiteturas permitem operações de número inteiro e endereço em alguns registros, mas ponto flutuante apenas em outros, ou permitem endereçamento apenas em relação a determinados registros. Às vezes, há registros especializados, como aqueles com bits de condição ou status que não podem ser usados para endereçamento ou aritmética.
As convenções de chamada de sub-rotina são expostas. Argumentos e valores de retorno podem ser passados em registradores ou empurrados e removidos de uma pilha. (Essa pilha geralmente é uma região de memória endereçada por um registrador de ponteiro de pilha especial, não um conjunto fixo como XYZ e T.)
Talvez você precise estar ciente de como interagir com o sistema operacional ou, se não houver, como lidar com recursos de hardware de baixo nível. Com um sistema operacional, você precisa carregar argumentos nos registradores (ou na pilha) e interceptar o kernel. Sem um sistema operacional, você provavelmente precisará lidar com interrupções e temporizadores.
Minha lembrança da programação de montagem é que é muito, muito doloroso. Eu acho que programar esta calculadora é fácil e divertido em comparação. (Desculpa.)
fonte
∧
,∨
,⊕
eИНВ
(o que significa INV) no teclado. 2) Eu pensei que seno, cosseno etc. são instruções de acordo com esta referência ref.x86asm.net/coder32.html para processadores x86. Mas é claro que concordo com você que o montador é muito mais complicado.Sim, isso definitivamente soa como uma linguagem assembly para mim.
É difícil dizer se isso é realmente montagem apenas a partir da descrição, porque a definição - uma linguagem cujos comandos mapeiam 1: 1 com o código de máquina da plataforma de destino - é difícil de determinar sem o conhecimento do código da máquina, mas isso soa como o ASM funciona em outras plataformas.
fonte
Certamente tem algumas semelhanças com uma linguagem assembly, mas vou argumentar que isso não é o que realmente é.
Em uma linguagem assembly, as operações mapeiam principalmente de 1 para 1 para as instruções da CPU. Existem algumas exceções, como macros e pseudo-ops (como, por exemplo, uma instrução CLEAR que realmente faz XORs um registro consigo); o ponto real é que um programa de montagem determina exatamente as instruções da CPU a serem geradas. (Essa é a diferença fundamental entre uma linguagem assembly e uma linguagem de nível superior como C; no último, os programas especificam o comportamento ).
A calculadora, sem dúvida, possui uma CPU, mas duvido que instruções individuais da CPU se refiram aos "registradores" X, Y, Z e T, ou executem operações de alto nível como
x
y
ousin
(ouПРГ
, o que isso significa!).Em vez disso, tenho certeza de que muitas ou a maioria das operações visíveis são feitas como chamadas de sub-rotina. E para cada operação executada, deve haver uma quantidade significativa de trabalho extra feito para exibir o resultado.
Você pode pensar nas operações visíveis como uma linguagem assembly para uma máquina virtual de alto nível, mas essa máquina virtual é implementada por meio de algo como um intérprete executando na CPU real.
Ainda assim, eu diria que a resposta para a segunda parte da sua pergunta:
é sim.
fonte
BMI
exemplo,IF ... THEN ...
geralmente são lidas como duas instruções: primeiro uma comparação (x < 0
neste caso), depois uma ação baseada no resultado dessa comparação (provavelmente um salto ao trabalhar) em linguagem assembly). No Intel 8086, algo como (supondo quex
esteja no AX)CMP AX, 0
JNL After_IfThen_Block
. (JNL sendo salto se não menos, em uma linguagem de alto nível, isso seria lido como algo parecidoif not (x < 0) then goto After_IfThen_Block
, que é o mesmo queif (x >= 0) then {code until there}
.)ПРГ
(PRG - programação) é apenas uma meta-chave para alternar para o modo de programação, não alguma função.Isso mesmo, o fragmento de código publicado parece com a linguagem assembly . A conversão adequada desse código definiria a versão.
Edit: ele possui um idioma específico para este dispositivo, mas não é assembly.
Também é parecido com uma calculadora feita pela URSS. Funciona com pilhas / cabo arredondados?
fonte
Eu diria que você está mais próximo de um híbrido de linguagem assembly BASIC, mas isso realmente depende da CPU e da arquitetura subjacentes. Não é necessário acesso direto à memória se você não tiver RAM verdadeira para falar. As operações de ponto flutuante também não precisam estar presentes sem uma FPU.
Eu acho que um teste simples seria uma operação de adição em um número de ponto flutuante e um número inteiro. A maioria das linguagens de programação de nível superior aceitaria ADD 2.5, 7 e retornaria 9.5. As linguagens assembly, no entanto, diferem a saída com base na instrução chamada e dependendo da representação do número subjacente em binário. A maioria das linguagens assembly exige que uma instrução diferente seja usada com base no uso de operações de ponto flutuante versus número inteiro. Uma exceção a isso pode ser algum tipo de formato de ponto fixo.
fonte
As calculadoras de notação polonesa reversa (RPN) eram clássicas. Não, embora as designações de registro pareçam linguagem assembly, não era. Os cálculos foram realizados através da tradução do formato algébrico para a pilha. Os números usados foram enviados para a pilha e as operações foram executadas no último empilhado contra o próximo ao último valor empilhado.
Você pode "girar" a pilha para mover os valores, pois o valor exibido era um membro da pilha. Os resultados podem ser trocados ou empilhados conforme necessário para executar cálculos quase complexos. Se você entende o hardware da pilha e a linguagem assembly, esta calculadora foi fácil de aprender, pois seu paradigma era muito semelhante.
fonte