Est-ce un langage d'assemblage?

70

Dans mon enfance, je programmais sur une calculatrice soviétique MK-61 . Il avait quatre registres de fonctionnement (X, Y, Z, T) et 15 registres de stockage. Un programme peut comporter 105 étapes.

Si je me souviens bien, il y avait des commandes comme:

  • Permuter les registres X et Y
  • Registres à décalage (Z à T, Y à Z, X à Y)
  • Copier du registre de stockage (1..15) vers X
  • Copier de X dans le registre de stockage (1..15)
  • Si X <0, passez à l’étape de programme ##
  • Effectuer l'opération (+, -, *, /) en utilisant les valeurs X et Y et mettre le résultat à X

Cette commande définit-elle un langage d'assemblage? Ai-je eu une idée de base des langages d'assemblage en utilisant cet appareil?

Dispositif

Il s'avère que c'est quelque chose appelé "programmation de frappe" .

Fait amusant: une calculatrice similaire (comme celle-ci, mais avec une mémoire indépendante de l'énergie) a été utilisée comme matériel de sauvegarde pour les calculs de trajectoire de mission spatiale en 1988. :-)

defhlt
la source
Agréable! - Cette image ramène des souvenirs. J'ai toujours mon MK-52 dans le sous-sol quelque part :)
DXM
Cela ressemble à un clone soviétique du HP 65. Il peut être programmé en notation polonaise inverse avec des opérations qui poussent et tirent sur une pile. Les opérateurs RPN sont simplement enregistrés en mémoire et interprétés par ce qui équivaut probablement à un processeur 4004. Le code de la ROM 4004 a probablement été compilé à partir de l'assembleur 4004, mais les frappes au clavier ressemblent davantage à des macros de feuille de calcul.
Meredith Poor

Réponses:

13

Ce n'est pas un langage d'assemblage, c'est un langage machine.

Le langage machine désigne tout ce qui a une signification physique pour la machine. Dans le cas des ordinateurs de poche, ce sont les touches enfoncées, codées en chiffres dans la machine. Vous ne donnez pas plus d'informations sur cette machine Electronika MK61 , je vais donc donner l'exemple de la TI-57 : le langage machine utilisait le numéro de la clé indiquée sous forme de colonne dans les dizaines et de ligne dans les unités. Ainsi, par exemple, un programme qui incrémenterait la mémoire 8 serait:

33 8  57 1 58 23

C'est le langage machine: c'est ce qui est directement interprété par la machine.

Le langage d'assemblage serait le texte lisible par l'homme :

RCL 8 
+
1
=
STO 8

Pour transformer ce texte en séquence de codes machine, vous avez besoin d'un assembleur , qui peut être un programme, ou d'un humain qui traduirait ce texte en séquence de nombres.

La confusion est souvent faite, car il y a souvent une traduction assez directe du langage assembleur au langage machine, mais ce n’est pas toujours une traduction tout à fait directe: les assembleurs de macros ont des macros puissantes qui peuvent faire beaucoup de travail dans l’assembleur et générer une beaucoup d'instructions en langage machine à partir d'une seule instruction d'assemblage. La simple traduction d'adresses symboliques peut impliquer de changer le code d'opération des instructions de branche (par exemple, lors du passage d'un adressage relatif court à un adressage relatif ou absolu long), de sorte que ce n'est pas toujours aussi direct qu'on pourrait le penser.

Pascal Bourguignon
la source
36

Je dirais que la réponse aux deux parties de votre question est non: les commandes de cette calculatrice ne ressemblent pas au langage assembleur, et la programmation de cette calculatrice est différente de la programmation en langage assembleur.

Le "langage" dans lequel cette calculatrice est programmée est de niveau assez bas, mais il représente toujours une abstraction au-dessus des constructions de niveau inférieur qui ne sont pas visibles pour vous en tant que programmeur. Je devine un peu, mais d'après votre description, et en regardant le clavier (et en le comparant à des calculatrices similaires de Hewlett Packard ou de Texas Instruments à la fin des années 1970 et au début des années 1980), je dirais que chaque programme "pourrait ne pas être une opération simple comme" ajouter "ou" échanger X & Y "mais également des opérations plus complexes telles que la trigonométrie, l'exponentiation, les logarithmes, etc. Chacune de ces étapes est probablement implémentée comme une routine microcodée interne. Ce microcode est probablement programmé en langage assembleur, mais je ne le pense pas

Comme d'autres l'ont décrit, le langage d'assemblage correspond généralement très bien (sinon 1: 1) aux installations de la machine sous-jacente. Je dirais que la programmation en langage assembleur inclut les caractéristiques suivantes qui ne sont probablement pas présentes dans la programmation de cette calculatrice.

  • Les opérations comprennent les opérations de niveau inférieur telles que AND, OR, XOR au niveau du bit, décalage; arithmétique de nombres entiers et (éventuellement) à virgule flottante, sur une variété de tailles de données (par exemple, simple ou double précision); charger / stocker une variété de tailles (octet, demi-mot, mot, etc.).

  • Les opérations de niveau supérieur (trig, logarithmes) sont généralement des appels de sous-programmes, pas des instructions. Il existe quelques exceptions, telles que le DEC VAX qui comportait une instruction d'évaluation polynomiale. [Edit: OP a fait remarquer que x87 a également des fonctions trigonométriques.]

  • Le schéma d'adressage de la machine est exposé. Si l'espace d'adressage est segmenté, vous devez charger une adresse de base dans un registre, puis un code d'adresse ou des données relatives à ce registre. Même avec un espace d'adressage plat, vous connaissez les adresses et leur arithmétique. Habituellement, les assembleurs autorisent les programmeurs à utiliser des étiquettes pour indiquer les adresses. Mais si une adresse est dans un segment différent, vous devrez peut-être charger un registre de segment avant de pouvoir y accéder.

  • L'alignement de la mémoire est exposé. Par exemple, sur de nombreuses machines, un mot de 4 octets ne peut être chargé ou stocké que dans des adresses multiples de 4 octets.

  • La représentation des données est exposée. Généralement, les assembleurs fournissent un moyen de spécifier des données numériques en hexadécimal, octal, décimal, virgule flottante et parfois en caractère.

  • La spécialisation des registres est exposée. Certaines architectures autorisent les opérations sur les entiers et les adresses dans certains registres, mais les virgules flottantes uniquement dans d'autres, ou n'autorisent l'adressage que relativement à certains registres. Parfois, il existe des registres spécialisés tels que ceux avec des bits de condition ou d'état qui ne peuvent pas être utilisés pour l'adressage ou l'arithmétique.

  • Les conventions d'appel des sous-programmes sont exposées. Les arguments et les valeurs de retour peuvent être passés dans des registres ou poussés dans une pile et extraits de celle-ci. (Cette pile est généralement une région de la mémoire adressée par un registre de pointeur de pile spécial, et non un ensemble fixe comme XYZ et T.)

  • Vous devrez peut-être savoir comment interagir avec le système d'exploitation ou, le cas échéant, comment utiliser des installations matérielles de bas niveau. Avec un système d'exploitation, vous devez charger les arguments dans les registres (ou la pile) et les insérer dans le noyau. Sans système d'exploitation, vous devrez probablement faire face à des interruptions et à des minuteries.

Si je me souviens bien de la programmation d’assemblage, c’est très douloureux. Je pense que la programmation de cette calculatrice est facile et amusante en comparaison. (Pardon.)

Stuart Marks
la source
1
1) Eh bien, il a une certaine opération au niveau du bit AND, OR, XOR, NOT - symboles bleus , , et ИНВ( ce qui signifie INV) sur le clavier. 2) Je pensais que sinus, cosinus, etc. étaient des instructions correspondant à cette référence ref.x86asm.net/coder32.html pour les processeurs x86. Mais bien sûr, je conviens avec vous que l’assemblage est beaucoup plus compliqué.
Dehlt
Si vous voulez la référence pour cette opération du jeu d'instructions VMS - deathrow.vistech.net/… . Quelques autres éléments amusants peuvent être trouvés dans esolangs.org/wiki/…
25

Oui, cela ressemble certainement à un langage d'assemblage pour moi.

Il est difficile de dire s'il s'agit vraiment d'un assemblage uniquement à partir de la description, car la définition - un langage dont les commandes correspondent 1: 1 avec le code machine de la plate-forme cible - est difficile à déterminer sans connaître le code machine lui-même. mais cela ressemble à la façon dont ASM fonctionne sur d'autres plates-formes.

Maçon Wheeler
la source
11

Cela ressemble certainement beaucoup à un langage d'assemblage, mais je vais dire que ce n'est pas ce que c'est vraiment.

Dans un langage d'assemblage, les opérations associent principalement les instructions 1 à 1 aux instructions de la CPU. Il existe certaines exceptions, telles que les macros et les pseudo-opérations (comme, par exemple, une instruction CLEAR qui permet réellement à XOR de s’enregistrer à un registre avec elle-même); le vrai point est qu’un programme d’assemblage détermine exactement les instructions de la CPU à générer. (C'est la différence fondamentale entre un langage assembleur et un langage de niveau supérieur tel que C; dans ce dernier, les programmes spécifient un comportement ).

La calculatrice contient sans aucun doute un processeur, mais je doute que des instructions de processeur individuelles se réfèrent aux "registres" X, Y, Z et T, ou effectuent des opérations de haut niveau telles que xyou sin(ou ПРГquoi que cela signifie!).

Au lieu de cela, je suis sûr que bon nombre des opérations visibles, ou la plupart d'entre elles, sont effectuées en tant qu'appels de sous-programmes. Et pour chaque opération exécutée, une quantité importante de travail supplémentaire doit être effectuée pour afficher le résultat.

Vous pouvez considérer les opérations visibles comme un langage d'assemblage pour une machine virtuelle de haut niveau, mais cette machine virtuelle est implémentée via quelque chose comme un interpréteur s'exécutant sur le processeur réel.

Pourtant, je dirais que la réponse à la deuxième partie de votre question:

Avais-je une idée de base des langages d'assemblage utilisant cet appareil?

est oui.

Keith Thompson
la source
1
Nos boîtes n’ont pas AX, BX, CX ni DX, les langages d’assemblage sont autorisés à la traduction symbolique. Je conviens que les fonctions de haut niveau ne sont très certainement pas assemblées, mais notez que ce qu'il a énuméré ne les incluait pas. Bien que je pense qu'il soit peu probable que ce soit vraiment un langage d'assemblage (tout devrait être de longueur fixe pour que le mode d'adressage fonctionne), aucune des commandes répertoriées ne va au-delà de ce que l'assembleur possède sur un PC.
Loren Pechtel
2
"si X <0, passez à l'étape de programme ##" est une instruction d'assemblage simple BMI (branche if minus).
mouviciel
1
@mouviciel Et même si la plate-forme ne supporte pas directement quelque chose comme l' BMIexemple, IF ... THEN ...on lit généralement deux instructions: une comparaison ( x < 0dans ce cas), puis une action basée sur le résultat de cette comparaison (probablement un saut lorsque vous travaillez). en langage d'assemblage). Dans Intel 8086, quelque chose comme (en supposant que ce xsoit dans AX) CMP AX, 0 JNL After_IfThen_Block. (JNL étant Jump if Not Less; dans un langage de niveau supérieur, cela ressemblerait à quelque chose du genre if not (x < 0) then goto After_IfThen_Block, ce qui est identique à if (x >= 0) then {code until there}.)
un CVn
1
ПРГ(PRG - programmation) est juste une méta clé pour passer en mode de programmation, pas une fonction.
Oleg V. Volkov
1
@mouviciel: Je suis sceptique sur le fait que "si X <0 alors passe à l'étape de programme ##" est en réalité implémenté comme une instruction CPU matérielle unique. Je suppose qu'un programme saisi sur la calculatrice n'est pas stocké sous forme d'une séquence d'instructions de la CPU; il est plutôt stocké sous la forme d'une séquence d'instructions de niveau supérieur interprétées par un programme de microprogramme. Je n'ai jamais travaillé avec cette calculatrice particulière, mais j'ai utilisé le HP-48; le jeu d'instructions visible par l'utilisateur est très différent de celui du processeur Saturn qu'il utilise.
Keith Thompson
9

C'est vrai, le fragment de code posté ressemble au langage d' assemblage . La conversion appropriée de ce code définirait la version.

Edit: il a un langage spécifique pour cet appareil, mais ce n'est pas un assemblage.

Il ressemble également à une calculatrice fabriquée par l'URSS. Fonctionne-t-il avec des piles / un cordon arrondis?

EL Yusubov
la source
3
Correct, il a été produit en Ukraine soviétique à partir du milieu des années 80. J'en ai fait une en 1991. Elle possède les deux emplacements pour 3 piles AA et pour l'adaptateur 220v.
defhlt
1
C'est vraiment une nostalgie pour moi. Je me souviens de ce nom de marque "Elektronika" :)
EL Yusubov
3

Je dirais que vous êtes plus proche d’un hybride de langage assembleur BASIC, mais cela dépend vraiment de la CPU et de l’architecture sous-jacentes. Il n’est pas nécessaire d’avoir un accès direct à la mémoire si vous n’avez pas de vraie RAM à proprement parler. Les opérations en virgule flottante ne doivent pas non plus être présentes sans FPU.

Je pense qu'un test simple serait une opération d'addition sur un nombre à virgule flottante et un entier. La plupart des langages de programmation de niveau supérieur accepteraient ADD 2.5, 7 et renverraient 9.5. Les langages d'assemblage différeraient toutefois la sortie en fonction de l'instruction appelée et en fonction de la représentation numérique sous-jacente en binaire. La plupart des langages d'assemblage requièrent l'utilisation d'une instruction différente basée sur l'utilisation d'opérations à virgule flottante ou entière. Une exception à cela pourrait être une sorte de format de point fixe.

Peter Smith
la source
Il pourrait simplement traiter tous les nombres comme des nombres flottants et prendre en compte l'un des arguments 7.0.
Oleg V. Volkov
@ OlegV.Volkov peut-être, cependant, vous n'avez besoin que de choisir deux nombres en virgule flottante dont la somme n'a pas de représentation vraie. Vous pouvez également rechercher des erreurs d'annulation dans la soustraction.
Peter Smith
3

Les calculatrices de notation polonaise inverse (RPN) étaient classiques. Non, bien que les désignations de registre semblent être du langage d'assemblage, ce n'était pas le cas. Les calculs ont été effectués en convertissant le format algébrique sur la pile. Les nombres utilisés ont été placés dans la pile et les opérations ont été effectuées sur la dernière pile empilée par rapport aux valeurs empilées suivantes.

Vous pouvez "faire pivoter" la pile pour déplacer les valeurs car la valeur affichée était un membre de la pile. Les résultats peuvent être échangés ou empilés si nécessaire pour effectuer des calculs presque complexes. Si vous comprenez le matériel de pile et le langage d'assemblage, cette calculatrice était facile à apprendre car son paradigme était très similaire.

Puce
la source