Isso é uma linguagem assembly?

70

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?

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. :-)

defhlt
fonte
Agradável! - essa imagem traz de volta memórias. Eu ainda tenho o meu MK-52 no porão em algum lugar :)
DXM
Parece um clone soviético do HP 65. Ele pode ser programado em notação polonesa reversa com operações que empurram e puxam uma pilha. Os operadores RPN são simplesmente gravados na memória e interpretados por um que provavelmente é equivalente a uma CPU 4004. O código na ROM do 4004 provavelmente foi compilado a partir do 4004 assembler, mas as teclas são realmente mais como macros de planilhas.
Meredith Poor

Respostas:

13

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:

33 8  57 1 58 23

Esta é a linguagem da máquina: é o que é diretamente interpretado pela máquina.

A linguagem assembly seria o texto legível por humanos :

RCL 8 
+
1
=
STO 8

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.

Pascal Bourguignon
fonte
36

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.)

Stuart Marks
fonte
11
1) Bem, tem alguma operação bit a bit AND, OR, XOR, NOT - símbolos azuis , , 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.
defhlt
Se você deseja a referência para a operação do conjunto de instruções VMS - deathrow.vistech.net/… . Alguns outros bits divertidos podem ser encontrados em esolangs.org/wiki/…
25

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.

Mason Wheeler
fonte
11

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 xyou sin(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:

Eu tive uma idéia básica de linguagens assembly usando este dispositivo?

é sim.

Keith Thompson
fonte
11
Nossas caixas também não possuem AX, BX, CX e DX - os idiomas de montagem são permitidos na tradução simbólica. Concordo que as funções de alto nível certamente não são montagem, mas observe que o que ele listou não as incluiu. Embora eu ache improvável que realmente seja uma linguagem assembly (tudo teria que ter um comprimento fixo para que o modo de endereçamento funcionasse), nenhum dos comandos listados está além do que o assembler em um PC possui.
Loren Pechtel 13/07/12
2
"se X <0, vá para a etapa do programa ##" é uma instrução de montagem simples do IMC (ramificação se menos).
Mouviciel 13/07/12
11
@mouviciel E mesmo que a plataforma não suporte diretamente algo como o BMIexemplo, IF ... THEN ...geralmente são lidas como duas instruções: primeiro uma comparação ( x < 0neste 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 que xesteja 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 parecido if not (x < 0) then goto After_IfThen_Block, que é o mesmo que if (x >= 0) then {code until there}.)
um CVn
11
ПРГ(PRG - programação) é apenas uma meta-chave para alternar para o modo de programação, não alguma função.
Oleg V. Volkov
11
@mouviciel: Eu sou cético quanto ao fato de que "se X <0, vá para a etapa do programa ##", na verdade, é implementada como uma única instrução de CPU de hardware. Especulo que um programa inserido na calculadora não seja armazenado como uma sequência de instruções da CPU; em vez disso, é armazenado como uma sequência de instruções de nível superior que são interpretadas por um programa de firmware. Eu nunca trabalhei com esta calculadora em particular, mas usei o HP-48; o conjunto de instruções visíveis ao usuário é muito diferente daquele da CPU Saturn que ele usa.
21412 Keith Thompson
9

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?

EL Yusubov
fonte
3
Correto, foi produzido na Ucrânia soviética em meados dos anos 80. Eu tenho um feito em 1991. Ele possui dois slots para 3 pilhas AA e para o adaptador 220v.
Defhlt
11
Isso é realmente um nostálgico para mim. Lembro-me esta marca "Elektronika" :)
EL Yusubov
3

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.

Peter Smith
fonte
Ele poderia simplesmente tratar todos os números como flutuadores e considerar um dos argumentos 7.0.
Oleg V. Volkov
@ OlegV.Volkov talvez, no entanto, você só precisa escolher dois números de ponto flutuante cuja soma não tem representação verdadeira. Além disso, você pode procurar erros de cancelamento na subtração.
Peter Smith
3

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.

Lasca
fonte