web-dev-qa-db-fra.com

Est-ce une langue d'assemblage?

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

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

  • Permuter les registres X et Y
  • Registres à décalage (Z à T, Y à Z, X à Y)
  • Copie du registre de stockage (1..15) vers X
  • Copie de X vers 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 sur X

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

Device

Il s'avère que c'est quelque chose qui s'appelle "programmation par touches" .

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 des missions spatiales en 1988. :-)

70
defhlt

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

Le langage machine est tout ce qui signifie physiquement quelque chose pour la machine. Dans le cas des ordinateurs de poche, il s'agit d'appuis sur les touches, codés en chiffres dans la machine. Vous ne donnez pas plus d'informations à ce sujet Machine Electronika MK61 , donc je vais donner l'exemple de la TI-57 : le langage machine utilisé le numéro de la clé donnée comme colonne dans les dizaines et 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 du 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 auriez besoin d'un assembleur , qui peut être un programme, ou un humain qui traduirait ce texte en la séquence des nombres.

La confusion est souvent faite, car il y a souvent une traduction assez directe du langage d'assemblage au langage machine, mais ce n'est pas toujours une traduction entièrement directe: les assembleurs de macros ont des macros puissantes qui peuvent faire beaucoup de travail dans l'assembleur et générer un 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 op des instructions de branchement (par exemple, lors du passage d'un adressage relatif court à un adressage relatif long ou absolu), donc ce n'est pas toujours aussi direct que vous ne le pensez.

13
Pascal Bourguignon

Je dirais que la réponse aux deux parties de votre question est non: les commandes de cette calculatrice ne sont pas comme le langage d'assemblage, et la programmation de cette calculatrice est différente de la programmation en langage d'assemblage.

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 de la fin des années 1970 et du début des années 1980), je dirais que chaque programme "étape "non seulement pourrait être une opération simple comme" ajouter "ou" échanger X & Y "mais aussi des opérations plus complexes comme 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 pense pas qu'il soit visible par la programmation d'une calculatrice ordinaire au niveau que vous avez décrit.

Comme d'autres l'ont décrit, le langage d'assemblage est généralement en correspondance très étroite (sinon 1: 1) avec les installations de la machine sous-jacente. Je dirais que la programmation en langage assembleur comprend 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 les bits ET, OU, XOR, le décalage; arithmétique entière et (peut-être) à 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-programme et non des instructions. Il y a quelques exceptions, comme le DEC VAX qui avait une instruction d'évaluation polynomiale. [Edit: OP a souligné que x87 a également des fonctions trig.]

  • 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 l'arithmétique des adresses. Généralement, les assembleurs autorisent les programmeurs à utiliser des étiquettes pour désigner les adresses. Mais si une adresse se trouve 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é qu'à des adresses qui sont des multiples de 4 octets.

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

  • La spécialisation des registres est exposée. Certaines architectures autorisent les opérations sur les nombres entiers et les adresses dans certains registres, mais en virgule flottante uniquement sur d'autres, ou permettent l'adressage uniquement par rapport à 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 de sous-programme sont exposées. Les arguments et les valeurs de retour peuvent être passés dans des registres, ou poussés et extraits d'une pile. (Cette pile est généralement une région de mémoire adressée par un registre de pointeur de pile spécial, pas un ensemble fixe comme X Y Z et T.)

  • Vous devrez peut-être savoir comment interagir avec le système d'exploitation, ou s'il n'y en a pas, comment gérer les installations matérielles de bas niveau. Avec un OS, vous devez charger des arguments dans les registres (ou la pile) et les piéger dans le noyau. Sans système d'exploitation, vous devrez probablement gérer les interruptions et les minuteries.

Si je me souviens bien de la programmation de l'Assemblée, c'est très, très douloureux. Je pense que la programmation de cette calculatrice est facile et amusante en comparaison. (Désolé.)

36
Stuart Marks

Oui, cela me semble définitivement être un langage d'assemblage.

Il est difficile de dire si oui ou non est Assemblage uniquement à partir de la description, car la définition - un langage dont les commandes mappent 1: 1 avec le code machine de sa plate-forme cible - est difficile à déterminer sans connaissance du code machine lui-même, mais cela ressemble à la façon dont ASM fonctionne sur d'autres plates-formes.

25
Mason Wheeler

Il a certainement des similitudes étroites avec une langue de l'Assemblée, mais je vais faire valoir que ce n'est pas vraiment ce que c'est.

Dans un langage d'assemblage, les opérations mappent principalement 1 à 1 aux instructions du processeur. Il y a quelques exceptions, telles que les macros et les pseudo-opérations (comme, disons, une instruction CLEAR qui XOR vraiment un registre avec elle-même); le vrai point est qu'un programme d'assemblage détermine exactement les instructions CPU à générer. (C'est la différence fondamentale entre un langage d'assemblage et un langage de niveau supérieur comme C; dans ce dernier, les programmes spécifient comportement).

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

Au lieu de cela, je suis sûr que la plupart ou la plupart des opérations visibles sont effectuées sous forme d'appels de sous-programme. 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 fonctionnant sur le vrai CPU.

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

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

c'est oui.

11
Keith Thompson

C'est vrai, le fragment de code publié ressemble à Assembly langue. La bonne conversion de ce code définirait la version.

Edit: il a une langue spécifique pour cet appareil, mais ce n'est pas Assembly.

Il ressemble également à une calculatrice faite en URSS. Fonctionne-t-il avec des piles/cordons arrondis?

9
Yusubov

notation polonaise inversée (RPN) les calculatrices étaient classiques. Non, bien que les désignations de registres semblent être du langage d'assemblage, ce n'était pas le cas. Les calculs ont été effectués en traduisant du format algébrique sur la pile. Les nombres utilisés ont été poussés dans la pile et les opérations ont été effectuées sur le dernier empilé contre l'avant-dernière valeur empilée.

Vous pouvez "faire pivoter" la pile pour déplacer les valeurs car la valeur affichée est un membre de la pile. Les résultats peuvent être échangés ou empilés selon les besoins 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 le plus similaire.

3
Chip

Je dirais que vous êtes plus proche d'un hybride BASIC Assembly Language, mais cela dépend vraiment du CPU et de l'architecture sous-jacents. Il n'y a pas besoin d'avoir un accès direct à la mémoire si vous n'avez pas de vrai RAM à proprement parler. Les opérations en virgule flottante n'ont pas non plus besoin d'ê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 retourneraient 9.5. Cependant, les langages d'assemblage diffèrent la sortie en fonction de l'instruction appelée et en fonction de la représentation sous-jacente des nombres en binaire. La plupart des langages d'assemblage nécessitent une instruction différente à utiliser, basée sur l'utilisation d'opérations à virgule flottante ou entière. Une exception à cela pourrait être une sorte de format à virgule fixe.

3
Peter Smith