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?
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. :-)
Réponses:
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:
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 :
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.
la source
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.)
la source
∧
,∨
,⊕
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é.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.
la source
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
x
y
ousin
(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:
est oui.
la source
BMI
exemple,IF ... THEN ...
on lit généralement deux instructions: une comparaison (x < 0
dans 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 cex
soit 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 genreif not (x < 0) then goto After_IfThen_Block
, ce qui est identique àif (x >= 0) then {code until there}
.)ПРГ
(PRG - programmation) est juste une méta clé pour passer en mode de programmation, pas une fonction.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?
la source
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.
la source
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.
la source