Esta é uma linguagem assembly?

70

Na minha infância eu costumava programar em um MK-61 Soviet . Ele tinha quatro registros de operação (X, Y, Z, T) e 15 registros de armazenamento. Um programa pode ter 105 etapas.

Pelo que me lembro, tinha comandos como:

  • Registros de troca X e Y
  • Registros de deslocamento (Z para T, Y para Z, X para Y)
  • Copiar do registro de armazenamento (1..15) para X
  • Copiar de X para o registro de armazenamento (1..15)
  • Se X < 0 então vá para a etapa ##
  • do programa
  • Executa a operação (+, -, *, /) usando valores X e Y e coloca o resultado em X

Este comando define uma linguagem assembly? Eu tive uma ideia básica de linguagens assembly usando este dispositivo?

Acontecequeéalgochamado "programação de teclas" .

Fato engraçado: uma calculadora similar (como esta, mas com memória independente de energia) foi usada como um hardware de back-up para cálculos de trajetória de missão espacial em 1988. -)

    
por defhlt 13.07.2012 / 00:00
fonte

7 respostas

13

Esta não é uma linguagem de montagem, é 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 principais impressoras, codificadas em números na máquina. Você não dá mais informações sobre essa máquina Electronika MK61 , então eu vou dar o exemplo da TI-57 : o idioma da máquina usava o número da chave dada como coluna nas dezenas e linha nas unidades. Então, por exemplo, um programa que incrementaria a memória 8 seria:

33 8  57 1 58 23

Isso é linguagem de 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 assembler , que pode ser um programa, ou um humano que traduzisse esse texto na sequência de números.

A confusão geralmente é feita, porque geralmente há uma tradução direta da linguagem assembly para a linguagem de máquina, mas isso nem sempre é uma tradução totalmente direta: os montadores de macro têm macros poderosas que podem fazer muito trabalho no montador e gerar muitas instruções em linguagem de máquina a partir 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çamento relativo curto para endereçamento longo relativo ou absoluto), portanto nem sempre é tão direto quanto se pensa.

    
por 13.07.2012 / 11:29
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 linguagem assembly, e programar esta calculadora é diferente da programação em linguagem assembly.

A "linguagem" em que esta calculadora está programada é de nível razoavelmente baixo, mas ainda representa uma abstração em cima de construções de nível inferior que não são visíveis para você como o programador. Eu estou supondo um pouco, mas a partir de sua descrição, e de olhar para o teclado (e compará-lo com calculadoras de aparência semelhante da Hewlett Packard ou Texas Instruments do final dos anos 70 e início dos anos 80) eu diria que cada programa "não só poderia ser uma operação simples como" adicionar "ou" trocar X & 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 não acho que seja visível para a programação comum da calculadora no nível que você descreveu.

Como outros descreveram, a linguagem assembly geralmente está em 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 bit a bit AND, OR, XOR, shifting; aritmética de ponto flutuante inteiro e (talvez), numa variedade de tamanhos de dados (por exemplo, precisão simples ou dupla); carregar / armazenar uma variedade de tamanhos (byte, halfword, word, etc.).

  • Operações de nível mais alto (trigonometria, logaritmos) geralmente são chamadas de sub-rotina, não instruções. Há algumas exceções, como o DEC VAX, que teve uma instrução de avaliação polinomial. [Edit: OP apontou que o x87 também tem funções trigonométricas].

  • O esquema de endereçamento da máquina é exposto. Se o espaço de endereçamento for segmentado, você terá que carregar um endereço base em um registrador e, em seguida, endereçar o código ou dados relativos a esse registro. Mesmo com um espaço de endereço simples, você está ciente da aritmética de endereços e endereços. Normalmente, os montadores permitem que os programadores usem rótulos para denotar endereços. Mas se um endereço estiver em um segmento diferente, você pode ter que carregar um registro de segmento antes de poder acessá-lo.

  • O alinhamento da memória é exposto. Por exemplo, em muitas máquinas, uma palavra de 4 bytes só pode ser carregada ou armazenada em endereços que são múltiplos de 4 bytes.

  • A representação de dados é exposta. Geralmente os montadores fornecem alguma 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 inteiros e endereços em alguns registradores, mas apenas em outros pontos, ou permitem o endereçamento apenas em relação a certos registradores. Às vezes, existem registros especializados, como aqueles com condição ou bits de status que não podem ser usados para endereçamento ou aritmética.

  • As convenções de chamada de rotina estão expostas. Argumentos e valores de retorno podem ser passados em registradores, ou empurrados para e disparados de uma pilha. (Esta pilha é geralmente uma região de memória endereçada por um registrador de ponteiro de pilha especial, não um conjunto fixo como X Y Z e T.)

  • Você pode precisar estar ciente de como interagir com o sistema operacional ou, se não houver, como lidar com instalações de hardware de baixo nível. Com um sistema operacional, você precisa carregar argumentos em registradores (ou na pilha) e interceptar o kernel. Sem um sistema operacional, você provavelmente terá que lidar com interrupções e temporizadores.

Minha lembrança da programação de montagem é que é muito dolorosa. Eu acho que programar esta calculadora é fácil e divertido em comparação. (Desculpe.)

    
por 13.07.2012 / 04:11
fonte
25

Sim, definitivamente soa como uma linguagem assembly para mim.

É difícil dizer se a 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 sua plataforma de destino - é difícil determinar sem o conhecimento do código da máquina em si, mas isso soa como o modo como o ASM funciona em outras plataformas.

    
por 13.07.2012 / 00:14
fonte
11

Certamente tem algumas semelhanças com uma linguagem assembly, mas vou argumentar que não é o que realmente é.

Em uma linguagem de montagem, as operações geralmente mapeiam de 1 para 1 para as instruções da CPU. Existem algumas exceções, como macros e pseudo-ops (como, digamos, uma instrução CLEAR que realmente registra um XOR em si); 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 de montagem e uma linguagem de nível superior, como C; no segundo, os programas especificam comportamento ).

A calculadora, sem dúvida, tem uma CPU, mas duvido que as 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 ou sin (ou ПРГ , o que quer que isso signifique!).

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 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 interpretador sendo executado na CPU real.

Ainda assim, eu diria que a resposta para a segunda parte da sua pergunta:

Did I have a basic idea of assembly languages using this device?

é sim.

    
por 13.07.2012 / 02:42
fonte
9

É isso mesmo, o fragmento de código postado parece com o idioma assembly . A conversão correta deste código definiria a versão.

Editar: tem algum idioma específico para este dispositivo, mas não é montagem.

Também é parecido com uma calculadora feita pela URSS. Funciona com pilhas / cabos arredondados?

    
por 13.07.2012 / 00:47
fonte
3

Eu diria que você está mais próximo de um híbrido de linguagem de montagem BASIC, mas isso realmente depende da CPU e da arquitetura subjacentes. Não há necessidade de acesso direto à memória se você não tiver uma RAM verdadeira para falar. Operações de ponto flutuante também não precisam estar presentes sem um FPU.

Eu acho que um teste simples seria uma operação de adição em um número de ponto flutuante e um inteiro. A maioria das linguagens de programação de nível mais alto aceitaria ADD 2.5, 7 e retornaria 9.5. No entanto, as linguagens de montagem difeririam 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 requer uma instrução diferente para ser usada com base no uso de operações de ponto flutuante vs inteiro. Uma exceção a isso pode ser algum tipo de formato de ponto fixo.

    
por 13.07.2012 / 04:35
fonte
3
As calculadoras Reverse Polish notation (RPN) eram clássicas. Não, embora as designações de registro pareçam linguagem de montagem, não. Os cálculos foram realizados traduzindo do formato algébrico para a pilha. Os números usados foram empurrados para a pilha e as operações foram executadas no último empilhado contra os valores empilhados próximos ao último.

Você poderia "girar" a pilha para mover os valores, já que 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ê entender o hardware de pilha e a linguagem de montagem, essa calculadora seria fácil de aprender, já que seu paradigma era o mais semelhante.

    
por 13.07.2012 / 16:52
fonte