Contacts

Structure du programme d'assemblage. Informations de base sur le langage assembleur. Dans la discipline "Programmation Système. La structure d'une commande en langage assembleur contient

1. Architecture du PC ………………………………………………………… 5

    1.1. Registres.

    1.1.1 Registres à usage général.

1.1.2. Registres de segments

1.1.3 Registre des drapeaux

1.2. Organisation de la mémoire.

1.3. Présentation des données.

1.3.1 Types de données

1.3.2 Représentation des caractères et des chaînes

2. Opérateurs du programme assembleur ……………………………………

    1. Commandes en langage assembleur

2.2. Modes d'adressage et formats d'instructions machine

3. Pseudo-opérateurs ……………………………………………………….

3.1 Directives de définition des données

3.2 Structure d'un programme en langage assembleur

3.2.1 Segments de programme. Assumer la directive

3.2.3 Directive de segmentation simplifiée

4. Assemblage et liaison du programme ………………………….

5. Commandes d'envoi de données …………………………………………….

    5.1 Commandes générales

    5.2 Commandes pour travailler avec la pile

5.3 Commandes E/S

5.4 Commandes de transfert d'adresse

5.5 Commandes de transfert de drapeaux

6. Commandes arithmétiques …………………………………………….

    6.1 Opérations arithmétiques sur les entiers binaires

6.1.1 Addition et soustraction

6.1.2 Commandes pour incrémenter et décrémenter le récepteur d'un

6.2 Multiplication et division

6.3 Changement de signe

7. Opérations logiques ………………………………………………….

8. Changements et changements cycliques …………………………………………

9. Opérations sur les chaînes ………………………………………………….

10. Logique et organisation des programmes ………………………………………

10.1 Sauts inconditionnels

10.2 Sauts conditionnels

10.4 Routines en langage assembleur

10.5 Interruptions INT

10.6 Logiciel système

10.6.1.1 Lecture du clavier.

10.6.1.2 Affichage des caractères à l'écran

10.6.1.3 Fin des programmes.

10.6.2.1 Sélection des modes d'affichage

11. Mémoire disque ……………………………………………………… ..

11.2 Tableau d'allocation des fichiers

11.3 E/S disque

11.3.1 Écrire un fichier sur le disque

11.3.1.1 Données au format ASCIIZ

11.3.1.2 Numéro de dossier

11.3.1.3 Créer un fichier disque

11.3.2 Lecture d'un fichier disque

introduction

Le langage assembleur est une représentation symbolique d'un langage machine. Tous les processus d'un ordinateur personnel (PC) au niveau matériel le plus bas sont pilotés uniquement par des commandes en langage machine (instructions). Il est impossible de vraiment résoudre les problèmes liés au matériel (ou même, de plus, les problèmes liés au matériel tels que l'amélioration des performances du programme) sans connaître l'assembleur.

L'assembleur est une forme pratique de commandes directement pour les composants du PC et nécessite la connaissance des propriétés et des capacités du circuit intégré contenant ces composants, à savoir le microprocesseur du PC. Ainsi, le langage assembleur est directement lié à l'organisation interne du PC. Et ce n'est pas un hasard si presque tous les compilateurs de langages de haut niveau prennent en charge l'accès au niveau de programmation en langage assembleur.

Un élément de la formation d'un programmeur professionnel est nécessairement l'étude de l'assembleur. En effet, la programmation en langage assembleur nécessite une connaissance de l'architecture PC, ce qui vous permet de créer des programmes plus efficaces dans d'autres langages et de les combiner avec des programmes en langage assembleur.

Le manuel traite des problèmes de programmation en langage assembleur pour les ordinateurs à base de microprocesseurs d'Intel.

Ce tutoriel s'adresse à toute personne intéressée par l'architecture des processeurs et les bases de la programmation en langage assembleur, principalement les développeurs de logiciels.

    Architecture PC.

L'architecture informatique est une représentation abstraite d'un ordinateur qui reflète son organisation structurelle, ses circuits et sa logique.

Tous les ordinateurs modernes ont des propriétés d'architecture communes et individuelles. Les propriétés individuelles ne sont inhérentes qu'à un modèle informatique spécifique.

Le concept d'architecture informatique comprend :

    schéma fonctionnel de l'ordinateur;

    des moyens et méthodes d'accès aux éléments du schéma bloc informatique ;

    ensemble et disponibilité des registres;

    organisation et modalités d'adressage;

    méthode de présentation et format des données informatiques;

    un ensemble d'instructions de machine informatique;

    formats d'instructions machine;

    interrompre la gestion.

Les principaux éléments du matériel informatique : l'unité centrale, le clavier, les périphériques d'affichage, les lecteurs de disque, les périphériques d'impression (imprimante) et diverses installations de communication. L'unité centrale se compose d'une carte mère, d'un bloc d'alimentation et de connecteurs d'extension pour des cartes supplémentaires. La carte système abrite un microprocesseur, une mémoire morte (ROM), une mémoire vive (RAM) et un coprocesseur.

      Registres.

A l'intérieur du microprocesseur, les informations sont contenues dans un groupe de 32 registres (16 registres utilisateur, 16 registres système), dans une certaine mesure disponibles pour une utilisation par le programmeur. Étant donné que le tutoriel est consacré à la programmation du microprocesseur 8088-i486, il est plus logique de commencer ce sujet en abordant les registres internes du microprocesseur à la disposition de l'utilisateur.

Les registres utilisateur sont utilisés par le programmeur pour écrire des programmes. Ces registres comprennent :

    huit registres 32 bits (registres à usage général) EAX/AX/AH/AL, EBX/BX/BH/BL, ECX/CX/CH/CL, EDX/DX/DLH/DL, EBP/BP, ESI/SI, EDI/DI, ESP/SP ;

    six registres de segments de 16 bits : CS, DS, SS, ES, FS, GS ;

    registres d'état et de contrôle : registre de drapeau EFLAGS / FLAGS et registre de pointeur d'instruction EIP / IP.

La barre oblique marque les parties d'un seul registre de 32 bits. Le préfixe E (étendu) indique l'utilisation d'un registre de 32 bits. Pour travailler avec des octets, des registres avec les préfixes L (bas) et H (haut) sont utilisés, par exemple, AL, CH - désignant les octets bas et haut des parties 16 bits des registres.

        Registres à usage général.

EAX / AX / AH / AL (Registre accumulateur) - batterie... Ils sont utilisés dans la multiplication et la division, dans les opérations d'E/S et dans certaines opérations sur les chaînes.

EBX / BX / BH / BL - registre de base(registre de base), souvent utilisé lors de l'adressage des données en mémoire.

ECX / CX / CH / CL - compteur(registre de comptage), utilisé comme compteur du nombre de répétitions de boucle.

EDX / DX / DH / DL - registre de données(registre de données), utilisé pour stocker des données intermédiaires. Il est obligatoire pour certaines commandes.

Tous les registres de ce groupe permettent l'accès à leurs parties "inférieures". Seules les parties inférieures de 16 et 8 bits de ces registres peuvent être utilisées pour l'auto-adressage. Les 16 bits supérieurs de ces registres ne sont pas disponibles en tant qu'objets indépendants.

Pour prendre en charge les commandes de traitement de ligne qui permettent le traitement séquentiel de chaînes d'éléments d'une longueur de 32, 16 ou 8 bits, utilisez :

ESI / SI (registre d'index source) - indice la source... Contient l'adresse de l'élément source actuel.

EDI / DI (registre d'index de destination) - indice receveur(destinataire). Contient l'adresse actuelle dans la chaîne de réception.

Dans l'architecture du microprocesseur, une structure de données - une pile - est supportée au niveau matériel-logiciel. Il existe des commandes spéciales et des registres spéciaux pour travailler avec la pile. Il est à noter que la pile est remplie vers des adresses plus petites.

ESP / SP (registre de pointeur de pile) - S'inscrire aiguille empiler... Contient le pointeur vers le haut de la pile dans le segment de pile actuel.

EBP / BP (registre de pointeur de base) - registre de pointeur de base de pile... Conçu pour organiser l'accès aléatoire aux données à l'intérieur de la pile.

1.1.2. Registres de segments

Dans le modèle logiciel du microprocesseur, il y a six registres de segments : CS, SS, DS, ES, GS, FS. Leur existence est due aux spécificités de l'organisation et de l'utilisation de la RAM par les microprocesseurs Intel. Le matériel du microprocesseur prend en charge l'organisation structurelle du programme consistant en segments. Les registres de segments sont utilisés pour indiquer les segments actuellement disponibles. Le microprocesseur prend en charge les types de segments suivants :

    Segment de code. Contient des commandes de programme. Pour accéder à ce segment, utilisez le registre CS (code segment register) - registre de code de segment... Il contient l'adresse du segment d'instruction machine auquel le microprocesseur a accès.

    Segment de données. Contient les données traitées par le programme. Pour accéder à ce segment, utilisez le registre DS (data segment register) - registre de données de segment qui stocke l'adresse du segment de données du programme en cours.

    Segment de pile. Ce segment représente une zone de mémoire appelée la pile. Le microprocesseur organise la pile selon le principe : premier arrivé, premier parti. Le registre SS (stack segment register) est utilisé pour accéder à la pile - registre de segment de pile contenant l'adresse du segment de pile.

    Segment de données supplémentaires. Les données traitées peuvent être dans trois segments de données supplémentaires. Par défaut, les données sont supposées se trouver dans le segment de données. Lors de l'utilisation de segments de données supplémentaires, leurs adresses doivent être spécifiées explicitement à l'aide de préfixes de remplacement de segment spéciaux dans la commande. Les adresses des segments de données supplémentaires doivent être contenues dans les registres ES, GS, FS (registres de segment de données d'extension).

        Registres de contrôle et d'état

Le microprocesseur contient plusieurs registres qui contiennent des informations sur l'état du microprocesseur lui-même et du programme dont les commandes sont actuellement chargées dans le pipeline. C'est:

Registre de pointeur de commande EIP/IP ;

    enregistrer les drapeaux EFLAGS / FLAGS.

En utilisant ces registres, vous pouvez obtenir des informations sur les résultats de l'exécution de la commande et influencer l'état du microprocesseur lui-même.

EIP / IP (registre de pointeurs d'instructions) - aiguille équipes... Le registre EIP/IP a une largeur de 32 ou 16 bits et contient le décalage de la prochaine instruction à exécuter par rapport au contenu du registre de segment CS dans le segment d'instruction en cours. Ce registre n'est pas directement accessible, mais il peut être modifié par des commandes de saut.

EFLAGS / FLAGS (Registre des drapeaux) - S'inscrire drapeaux... Profondeur de bits 32/16 bits. Les bits individuels de ce registre ont un objectif fonctionnel spécifique et sont appelés drapeaux. Un drapeau est un bit qui prend la valeur 1 ("le drapeau est activé") si une certaine condition est remplie, et la valeur 0 ("le drapeau est effacé") sinon. La partie inférieure de ce registre est complètement analogue au registre FLAGS pour i8086.

1.1.3 Registre des drapeaux

Le registre des drapeaux est de 32 bits et porte le nom EFLAGS (Figure 1). Les bits individuels du registre ont un objectif fonctionnel spécifique et sont appelés drapeaux. Chacun d'eux se voit attribuer un nom spécifique (ZF, CF, etc.). Les 16 bits inférieurs d'EFLAGS représentent le registre d'indicateurs FLAGS à 16 bits utilisé lors de l'exécution de programmes écrits pour les microprocesseurs i086 et i286.

Fig. 1 Registre des drapeaux

Certains indicateurs sont communément appelés indicateurs de condition ; ils changent automatiquement lorsque les commandes sont exécutées et fixent certaines propriétés de leur résultat (par exemple, s'il est égal à zéro). D'autres drapeaux sont appelés drapeaux d'état ; ils changent du programme et affectent le comportement ultérieur du processeur (par exemple, les interruptions de bloc).

Indicateurs de condition :

CF (porte drapeau) - porter le drapeau... Prend la valeur 1 si, lors de l'ajout de nombres entiers, une unité de césure apparaissait qui ne « rentrait » pas dans la grille de bits, ou si, lors de la soustraction de nombres non signés, le premier d'entre eux était inférieur au second. Dans les commandes de décalage, un bit qui a dépassé la grille de bits est défini dans CF. CF capture également les caractéristiques de la commande de multiplication.

OF (indicateur de débordement) - indicateur de débordement... Il est mis à 1 si, lors de l'addition ou de la soustraction d'entiers signés, le résultat est un résultat supérieur en valeur absolue à la valeur admissible (la mantisse a débordé et elle a "monté" dans le bit de signe).

ZF (drapeau zéro) - drapeau zéro... Il est mis à 1 si le résultat de la commande était égal à 0.

SF (Drapeau SIG) - drapeau signer... Il est mis à 1 si l'opération sur les nombres signés aboutit à un résultat négatif.

PF (drapeau de parité) - drapeau parité... Egal à 1 si le résultat de la commande suivante contient un nombre pair de uns binaires. Elle n'est généralement prise en compte que lors des opérations d'E/S.

AF (drapeau de portage auxiliaire) - drapeau de transport supplémentaire... Corrige les particularités de l'exécution d'opérations sur des nombres décimaux binaires.

Indicateurs d'état :

DF (drapeau de direction) - drapeau de direction... Définit la direction de visualisation des lignes dans les commandes de chaîne : avec DF = 0, les lignes sont balayées "en avant" (du début à la fin), avec DF = 1 - dans la direction opposée.

IOPL (niveau de privilège d'entrée/sortie) - Niveau de privilège E/S. Il est utilisé dans le mode protégé du microprocesseur pour contrôler l'accès aux commandes d'E/S, en fonction du privilège de la tâche.

NT (tâche imbriquée) - indicateur d'imbrication de tâche. Il est utilisé dans le mode protégé du microprocesseur pour enregistrer le fait qu'une tâche est imbriquée dans une autre.

Indicateur système :

SI (indicateur d'interruption) - indicateur d'interruption... Si IF = 0, le processeur cesse de répondre aux interruptions entrantes, et si IF = 1, le verrou d'interruption est libéré.

TF (drapeau piège) - indicateur de trace... Si TF = 1, après l'exécution de chaque instruction, le processeur effectue une interruption (avec le numéro 1), qui peut être utilisée lors du débogage du programme pour le tracer.

RF (indicateur de reprise) - indicateur de reprise... Utilisé lors de la gestion des interruptions des registres de débogage.

VM (mode virtuel 8086) - drapeau virtuel 8086. 1-processeur fonctionne en mode virtuel 8086. 0-processeur fonctionne en mode réel ou protégé.

AC (contrôle d'alignement) - indicateur de contrôle d'alignement. Conçu pour permettre le contrôle de l'alignement lors de l'accès à la mémoire.

      Organisation de la mémoire.

La mémoire physique à laquelle le microprocesseur a accès est appelée RAM ( ou mémoire vive - RAM). La RAM est une chaîne d'octets qui ont leur propre adresse unique (son numéro), appelée physique. La plage de valeurs pour les adresses physiques est de 0 à 4 Go. Le mécanisme de gestion de la mémoire est entièrement basé sur le matériel.

Le microprocesseur prend en charge plusieurs modèles d'utilisation de la RAM dans le matériel :

    modèle segmenté... Dans ce modèle, la mémoire des programmes est divisée en zones de mémoire contiguës (segments), et le programme lui-même ne peut accéder qu'aux données qui se trouvent dans ces segments ;

    modèle de page... Dans ce cas, la RAM est considérée comme un ensemble de blocs d'une taille fixe de 4 Ko. L'application principale de ce modèle est associée à l'organisation de la mémoire virtuelle, qui permet aux programmes d'utiliser un espace mémoire supérieur à la quantité de mémoire physique. Pour un microprocesseur Pentium, la mémoire virtuelle possible peut aller jusqu'à 4 To.

L'utilisation et la mise en œuvre de ces modèles dépendent du mode de fonctionnement du microprocesseur :

    Mode adresse réelle (mode réel). Le mode est similaire au fonctionnement du processeur i8086. Il est nécessaire au fonctionnement des programmes développés pour les premiers modèles de processeurs.

    Mode protégé. En mode protégé, il devient possible de multitâcher le traitement de l'information, la protection de la mémoire à l'aide d'un mécanisme de privilège à quatre niveaux et sa pagination.

    Mode virtuel 8086. Dans ce mode, il devient possible d'exécuter plusieurs programmes pour le i8086. Dans ce cas, le fonctionnement des programmes en mode réel est possible.

La segmentation est un mécanisme d'adressage qui permet à plusieurs espaces d'adressage indépendants d'exister. Un segment est un bloc de mémoire indépendant pris en charge par le matériel.

Chaque programme dans le cas général peut comprendre un nombre quelconque de segments, mais il a un accès direct à trois principaux : code, données et pile - et d'un à trois segments de données supplémentaires. Le système d'exploitation place des segments de programme en RAM à des adresses physiques spécifiques, puis place les valeurs de ces adresses dans les registres correspondants. A l'intérieur d'un segment, le programme accède aux adresses relatives au début du segment de manière linéaire, c'est-à-dire en partant de l'adresse 0 et en se terminant par une adresse égale à la taille du segment. Adresse relative ou biais, que le microprocesseur utilise pour accéder aux données dans un segment est appelé efficace.

Formation d'une adresse physique en mode réel

En mode réel, la plage de changement de l'adresse physique est de 0 à 1 Mo. La taille maximale des segments est de 64 Ko. Lorsqu'on se réfère à un particulier adresse physique La RAM est déterminée par l'adresse du début du segment et le décalage à l'intérieur du segment. L'adresse de début de segment est extraite du registre de segment correspondant. Dans ce cas, le registre de segment ne contient que les 16 bits supérieurs de l'adresse physique du début du segment. Les quatre bits manquants les moins significatifs d'une adresse de 20 bits sont obtenus en décalant la valeur du registre de segment vers la gauche de 4 bits. L'opération de décalage est effectuée dans le matériel. La valeur de 20 bits résultante est l'adresse physique réelle correspondant au début du segment. C'est à dire adresse physique est spécifié comme une paire : segment : offset, où segment est les 16 premiers bits de l'adresse de début du segment de mémoire auquel appartient la cellule, et offset est l'adresse de 16 bits de cette cellule, comptée à partir du début de cette mémoire segment (la valeur 16 * segment + offset donne l'adresse absolue de la cellule). Si par exemple le registre CS mémorise la valeur 1234h, alors le couple d'adresses 1234h : 507h définit une adresse absolue égale à 16 * 1234h + 507h = 12340h + 507h = 12847h. Une telle paire est écrite sous la forme d'un double mot et (comme pour les nombres) sous une forme "inversée": le premier mot contient un décalage et le second - un segment, et chacun de ces mots à son tour est présenté dans une forme "inversée". Par exemple, la paire 1234h : 5678h s'écrira comme ceci : | 78 | 56 | 34 | 12 |.

Ce mécanisme de formation d'une adresse physique permet de rendre le logiciel délocalisable, c'est-à-dire qu'il ne dépend pas des adresses spécifiques de son chargement en RAM.

Par objectif, les commandes peuvent être distinguées (entre parenthèses sont des exemples de codes mnémoniques d'opérations pour les commandes assembleur d'un PC tel qu'IBM PC) :

l effectuer des opérations arithmétiques (ADD et ADC - addition et addition avec transfert, SUB et SBB - soustraction et soustraction avec emprunt, MUL et IMUL - multiplication non signée et signée, DIV et IDIV - division non signée et signée, CMP - comparaisons etc.) ;

l effectuer des opérations logiques (OU, ET, NON, XOR, TEST, etc.) ;

l transfert de données (MOV - envoyer, XCHG - échanger, IN - entrer dans le microprocesseur, OUT - sortir du microprocesseur, etc.);

l transfert de contrôle (branchements de programme : JMP - branchement inconditionnel, CALL - appel de procédure, RET - retour de procédure, J * - branchement conditionnel, LOOP - contrôle de boucle, etc.) ;

l traitement des chaînes de caractères (MOVS - transferts, CMPS - comparaisons, LODS - téléchargements, SCAS - scans. Ces commandes sont généralement utilisées avec le préfixe (modificateur de répétition) REP ;

l interruptions du programme (INT - interruptions logicielles, INTO - interruption conditionnelle en cas de débordement, IRET - retour d'interruption) ;

l commande par microprocesseur (ST * et CL * - drapeaux de mise et d'effacement, HLT - arrêt, WAIT - attente, NOP - ralenti, etc.).

Une liste complète des commandes assembleur peut être trouvée dans les travaux.

Commandes de transfert de données

l MOV dst, src - transfert de données (move - transfert de src à dst).

Transferts : un octet (si src et dst sont au format octet) ou un mot (si src et dst sont au format mot) entre registres ou entre registre et mémoire, et écrit également une valeur immédiate dans un registre ou une mémoire.

Les opérandes dst et src doivent être dans le même format d'octet ou de mot.

Src peut être de type : r (registre) - registre, m (mémoire) - mémoire, i (impédance) - valeur immédiate. Dst peut être de type r, m. Vous ne pouvez pas utiliser les opérandes suivants dans une commande : rsegm avec i; deux opérandes de type m et deux opérandes de type rsegm). L'opérande i peut aussi être une expression simple :

mov AX, (152 + 101B) / 15

L'expression n'est évaluée que pendant la traduction. Ne change pas les drapeaux.

l PUSH src - pousser un mot sur la pile (pousser - faire passer; pousser sur la pile de src). Pousse le contenu de src vers le haut de la pile - n'importe quel registre de 16 bits (y compris ceux de segment) ou deux emplacements mémoire contenant un mot de 16 bits. Les drapeaux ne changent pas ;

l POP dst - extraire un mot de la pile (pop - pop ; lire de la pile dans dst). Extrait un mot du haut de la pile et le place dans dst - n'importe quel registre 16 bits (segment compris) ou deux emplacements mémoire. Les drapeaux ne changent pas.

Sujet 2.5 Principes de base de la programmation du processeur

Au fur et à mesure que la longueur du programme augmente, il devient de plus en plus difficile de mémoriser des codes pour diverses opérations. Les désignations mnémoniques fournissent une aide à cet égard.

Le langage de codage symbolique de commande est appelé assembleur.

Langage d'assemblage Est un langage dans lequel chaque instruction correspond à exactement une instruction machine.

Assemblage s'appelle la conversion d'un programme en langage assembleur, c'est-à-dire la préparation d'un programme dans un langage machine en remplaçant les noms d'opérations symboliques par des codes machine, et les adresses symboliques par des nombres absolus ou relatifs, ainsi que l'inclusion de programmes de bibliothèque et la génération de séquences de symboles commandes en spécifiant des paramètres spécifiques dans des micro-instructions. Ce programme est généralement situé dans la ROM ou entré dans la RAM à partir d'un support externe.

Le langage assembleur a plusieurs caractéristiques qui le distinguent des langages de haut niveau :

1. Il s'agit d'une correspondance biunivoque entre les instructions du langage assembleur et les instructions machine.

2. Le programmeur en langage assembleur a accès à tous les objets et commandes présents sur la machine cible.

Une compréhension des bases de la programmation dans les langages orientés machine est utile pour :



Meilleure compréhension de l'architecture des PC et utilisation plus intelligente des ordinateurs ;

Développer des structures d'algorithmes plus rationnelles pour résoudre des problèmes appliqués ;

Possibilité de visualiser et de corriger les programmes exécutables avec les extensions .exe et.com compilés à partir de n'importe quel langage de haut niveau en cas de perte des programmes d'origine (en appelant les programmes spécifiés dans le débogueur du programme DEBUG et en décompilant leur affichage en langage assembleur );

Compilation de programmes pour résoudre les problèmes les plus critiques (un programme écrit dans un langage orienté machine est généralement plus efficace - plus court et plus rapide pour 30 à 60% des programmes obtenus à la suite d'une traduction à partir de langages de haut niveau)

Pour la mise en œuvre de procédures incluses dans le programme principal sous forme de fragments séparés dans le cas où elles ne peuvent être mises en œuvre ni dans le langage de haut niveau utilisé, ni à l'aide de procédures de service OS.

Un programme en langage assembleur ne peut s'exécuter que sur des ordinateurs de la même famille, tandis qu'un programme écrit dans un langage de haut niveau peut potentiellement s'exécuter sur des machines différentes.

L'alphabet du langage assembleur est composé de caractères ASCII.

Uniquement des nombres entiers. Distinguer:

Nombres binaires, se terminant par la lettre B;

Nombres décimaux, se terminant par la lettre D ;

Nombres hexadécimaux, se terminant par la lettre N.

RAM, registres, présentation des données

Pour une certaine série de MP, un langage de programmation individuel est utilisé - le langage assembleur.

Le langage assembleur occupe une position intermédiaire entre les codes machine et les langages de haut niveau. C'est plus facile de programmer dans ce langage. Un programme en langage assembleur utilise plus rationnellement les capacités d'une machine particulière (plus précisément, la TA) qu'un programme en langage de haut niveau (ce qui est plus facile pour un programmeur qu'un assembleur). Considérons les principes de base de la programmation dans les langages orientés machine en utilisant l'exemple du langage assembleur pour MP KR580VM80. Une technique courante est utilisée pour la programmation dans le langage. Des techniques concrètes d'enregistrement de programmes sont associées à l'architecture et au système de commande du MT cible.

Modèle de programme d'un système à microprocesseur basé sur MP KR580VM80

Le modèle logiciel du MPS conformément à la figure 1

Mémoire des ports MP

S Z CA P C

Image 1

Du point de vue du programmeur, le MP KR580VM80 possède les registres suivants accessibles par logiciel.

MAIS- Accumulateur de registre 8 bits. C'est le registre principal de la TA. Toute opération effectuée dans l'ALU suppose le placement d'un des opérandes à traiter dans l'accumulateur. Le résultat de l'opération dans l'ALU est également généralement stocké dans A.

B, C, D, E, H, L- Registres à usage général (RON) 8 bits. Mémoire interne MP. Conçu pour stocker les informations traitées, ainsi que les résultats de l'opération. Lors du traitement de mots de 16 bits, les paires BC, DE, HL sont formées à partir de registres et le double registre est appelé la première lettre - B, D, H. Dans une paire de registres, le premier registre est le plus élevé. Les registres H, L ont une propriété spéciale, qui sont utilisées à la fois pour stocker des données et pour stocker des adresses 16 bits de cellules RAM.

Floride- registre des drapeaux (registre des signes) Registre à 8 bits dans lequel sont stockés cinq signes du résultat de l'exécution d'opérations arithmétiques et logiques dans le MP. Format FL comme indiqué

Bit C (CY - report) - report, mis à 1 s'il y a eu un report du bit le plus significatif de l'octet lors de l'exécution d'opérations arithmétiques.

Bit P (parité) - parité, mis à 1 si le nombre de uns dans les bits du résultat est pair.

Le bit AC est un report supplémentaire, destiné à stocker la valeur de report du quartet inférieur du résultat.

Bit Z (zéro) - mis à 1 si le résultat de l'opération est 0.

Chiffre S (signe) - mis à 1 si le résultat est négatif, et à 0 si le résultat est positif.

SP–- pointeur de pile, registre 16 bits, destiné à mémoriser l'adresse de la cellule mémoire où a été écrit le dernier octet entré dans la pile.

RS- compteur de programme (compteur de programme), registre 16 bits, utilisé pour stocker l'adresse de la prochaine commande à exécuter. Le contenu du compteur de commandes est automatiquement incrémenté de 1 immédiatement après l'échantillonnage de l'octet de commande suivant.

La zone mémoire initiale de l'adresse 0000H - 07FF contient le programme de contrôle et les programmes de démonstration. C'est la zone ROM.

0800 - 0АFF - zone d'adresse pour l'écriture des programmes à l'étude. (RAM).

0В00 - 0ВВ0 - zone d'adresse pour l'enregistrement des données. (RAM).

0BB0 est l'adresse de début de la pile. (RAM).

Une pile est une zone de RAM spécialement organisée conçue pour stocker temporairement des données ou des adresses. Le dernier nombre poussé sur la pile est sauté en premier. Le pointeur de pile stocke l'adresse de la dernière cellule de la pile où les informations sont écrites. Lorsqu'un sous-programme est appelé, l'adresse de retour au programme principal est automatiquement enregistrée sur la pile. En règle générale, au début de chaque sous-programme, le contenu de tous les registres impliqués dans son exécution est enregistré sur la pile et à la fin du sous-programme, il est restauré à partir de la pile.

Format de données et structure des commandes en langage assembleur

La mémoire du MP KR580VM80 est un tableau de mots de 8 bits, appelés octets, chaque octet ayant sa propre adresse de 16 bits, qui détermine sa position dans la séquence des cellules mémoire. MP peut adresser 65536 octets de mémoire, qui peuvent contenir à la fois de la ROM et de la RAM.

Format des données

Les données sont stockées en mémoire sous forme de mots de 8 bits :

D7 D6 D5 D4 D3 D2 D1 D0

Le bit le moins significatif est le bit 0, le plus significatif est le bit 7.

Une commande est caractérisée par son format, c'est-à-dire par le nombre de bits qui lui sont alloués, qui sont divisés octet par octet en champs fonctionnels spécifiques.

Format de commande

Les commandes MP KR580VM80 ont un format à un, deux ou trois octets. Les commandes multi-octets doivent être placées dans les PL voisins. Le format de la commande dépend des spécificités de l'opération en cours.

Le premier octet de la commande contient l'opcode mnémonique.

Il définit le format de la commande et les actions qui doivent être effectuées par le MT sur les données lors de son exécution, et la méthode d'adressage, et peut également contenir des informations sur l'emplacement des données.

Les deuxième et troisième octets peuvent contenir des données sur lesquelles opérer, ou des adresses indiquant l'emplacement des données. Les données manipulées sont appelées opérandes.

Format de commande à un octet, comme illustré à la figure 2

Figure 4

Dans les commandes en langage assembleur, le code d'opération a une forme abrégée d'écriture de mots anglais - une désignation mnémotechnique. Les mnémoniques (du grec mnémonique - l'art de la mémorisation) facilitent la mémorisation des commandes en fonction de leur objectif fonctionnel.

Avant exécution, le programme source est traduit à l'aide d'un programme de traduction, appelé assembleur, dans le langage des combinaisons de codes - langage machine, sous cette forme il est situé dans la mémoire du MP puis utilisé lors de l'exécution de la commande.


Méthodes d'adressage

Tous les codes d'opérande (entrée et sortie) doivent se trouver quelque part. Ils peuvent être localisés dans les registres internes du MP (l'option la plus pratique et la plus rapide). Ils peuvent être situés dans la mémoire système (l'option la plus courante). Enfin, ils peuvent résider dans des périphériques d'E/S (le cas le plus rare). L'emplacement des opérandes est déterminé par le code de commande. Il existe différentes méthodes par lesquelles le code d'instruction peut déterminer où obtenir l'opérande d'entrée et où placer l'opérande de sortie. Ces méthodes sont appelées méthodes d'adressage.

Pour MP KR580VM80, il existe les méthodes d'adressage suivantes :

Immédiat;

Inscrit;

Indirect;

Empiler.

Immédiat l'adressage suppose que l'opérande (entrée) est en mémoire immédiatement après le code d'instruction. L'opérande est généralement une constante qui doit être envoyée quelque part, ajoutée à quelque chose, etc. les données sont contenues dans les deuxième ou deuxième et troisième octets de la commande, avec l'octet de données le moins significatif dans le deuxième octet de la commande, et le plus significatif dans les commandes de troisième octet.

Droit (il est aussi absolu) l'adressage suppose que l'opérande (entrée ou sortie) se trouve en mémoire à l'adresse dont le code se trouve à l'intérieur du programme immédiatement après le code instruction. Utilisé dans les commandes à 3 octets.

Inscrit l'adressage suppose que l'opérande (entrée ou sortie) se trouve dans le registre interne du MP. Utilisé dans les commandes à octet unique

Indirect L'adressage (implicite) suppose que dans le registre interne du MP il n'y a pas l'opérande lui-même, mais son adresse en mémoire.

Empiler l'adressage suppose que la commande ne contient pas d'adresse. Adressage des cellules mémoire par le contenu du registre SP 16 bits (pointeur de pile).

Système de commande

Le système de commande MP est une liste complète d'actions élémentaires que le MP est capable d'effectuer. Le MP contrôlé par ces commandes effectue des actions simples, telles que des opérations arithmétiques et logiques élémentaires, transfert de données, comparaison de deux valeurs, etc. Le nombre de commandes MP KR580VM80 est de 78 (dont 244 modifications).

On distingue les groupes de commandes suivants :

Transmission de données;

Arithmétique;

Casse-tête;

Commandes de transition ;

Commandes d'E/S, contrôle et travail avec la pile.


Symboles et abréviations utilisés dans les descriptions de commandes et la programmation

symbole Réduction
ADDR Adresse 16 bits
LES DONNÉES Données 8 bits
DONNÉES 16 Données 16 bits
PORT Adresse E/S 8 bits (périphériques E/S)
OCTET 2 Deuxième octet de commande
OCTET 3 Troisième octet de commande
R, R1, R2 Un des registres : A, B, C, D, E, H, L
PR L'une des paires de registres : B - définit la paire BC ; D - définit la paire DE; H - définit la paire HL
HR Premier registre d'une paire
RL Deuxième registre d'une paire
Λ Multiplication logique
V Addition logique
Ajout du module deux
M Cellule mémoire dont l'adresse fixe le contenu de la paire de registres HL, c'est-à-dire M = (HL)

Travail de cours

Dans la discipline "Programmation système"

Thème numéro 4 : "Résoudre les problèmes pour les procédures"

Option 2

UNIVERSITÉ D'ÉTAT DE SIBÉRIE ORIENTALE

TECHNOLOGIE ET ​​CONTRLE

____________________________________________________________________

COLLÈGE DE TECHNOLOGIE

LA TÂCHE

pour la dissertation

La discipline:
Sujet : Résolution de problèmes pour les procédures
Interprète(s) : Glavinskaya Arina Aleksandrovna
Chef : DambaevaSesegma Viktorovna
Le résumé du travail : l'étude des routines en langage assembleur,
résolution de problèmes à l'aide de sous-programmes
1. Partie théorique : Informations de base sur le langage assembleur (ensemble
commandes, etc.), Organisation des sous-programmes, Méthodes de passage des paramètres
dans les sous-programmes
2. Partie pratique : Développer deux sous-programmes, dont l'un convertit une lettre donnée en majuscule (y compris pour les lettres russes), et l'autre convertit la lettre en minuscule.
convertit n'importe quelle lettre donnée en majuscule et l'autre convertit la lettre en minuscule.
convertit une lettre en minuscule.
Échéances du projet dans les délais :
1. Partie théorique - 30% à 7 semaines.
2. Partie pratique - 70% en 11 semaines.
3. Protection - 100 % à la semaine 14.
Conditions d'inscription :
1. Le règlement et la note explicative du projet de cours doivent être présentés en
copies électroniques et papier.
2. Le volume du rapport doit être d'au moins 20 pages dactylographiées hors pièces jointes.
3. RPZ est établi conformément à GOST 7.32-91 et signé par le chef.

Chef de travaux __________________

Prestataire __________________

Date d'émission " 26 " septembre 2017 G.


Introduction. 2

1.1 Informations de base sur le langage assembleur. 3

1.1.1 Ensemble de commandes. 4

1.2 Organisation des sous-programmes en langage assembleur. 4

1.3 Méthodes de passage des paramètres dans les sous-programmes. 6

1.3.1 Passage de paramètres dans les registres .. 6

1.3.2 Passage de paramètres à travers la pile. 7

2 PARTIE PRATIQUE .. 9

2.1 Énoncé du problème. neuf

2.2 Description de la solution au problème. neuf

2.3 Tester le programme .. 7

Conclusion. huit

Références .. 9


introduction

Il est de notoriété publique qu'il est difficile de programmer en assembleur. Comme vous le savez, il existe maintenant de nombreuses langues différentes. haut niveau qui vous permettent de dépenser beaucoup moins d'efforts lors de l'écriture de programmes. Naturellement, la question se pose lorsqu'un programmeur peut avoir besoin d'utiliser l'assembleur lors de l'écriture de programmes. Actuellement, il existe deux domaines dans lesquels l'utilisation du langage assembleur est justifiée, et souvent nécessaire.

Premièrement, ce sont les programmes système dits dépendants de la machine, qui contrôlent généralement divers périphériques sur l'ordinateur (de tels programmes sont appelés pilotes). Ces programmes système utilisent des instructions machine spéciales qui n'ont pas besoin d'être utilisées normalement (ou, comme on dit, appliqué) programmes. Ces commandes sont impossibles ou très difficiles à définir dans un langage de haut niveau.

Le deuxième domaine d'application de l'assembleur est lié à l'optimisation de l'exécution du programme. Très souvent, les programmes de traduction (compilateurs) à partir de langages de haut niveau produisent un programme en langage machine très inefficace. Cela s'applique généralement aux programmes de nature informatique, dans lesquels une très petite section (environ 3-5%) du programme (boucle principale) est exécutée la plupart du temps. Pour résoudre ce problème, des systèmes de programmation dits multilingues peuvent être utilisés, qui vous permettent d'écrire des parties du programme dans différentes langues. Habituellement, la partie principale du programme est écrite dans un langage de programmation de haut niveau (Fortran, Pascal, C, etc.), et les sections critiques du programme sont écrites en assembleur. Dans ce cas, la vitesse de l'ensemble du programme peut être considérablement augmentée. C'est souvent le seul moyen de faire en sorte que le programme fournisse un résultat dans un délai raisonnable.

Le but de ce travail de cours est d'acquérir des compétences pratiques en programmation en langage assembleur.

Tâches de travail:

1. Apprendre les informations de base sur le langage Assembleur (structure et composants d'un programme Assembleur, le format des commandes, l'organisation des sous-programmes, etc.) ;

2. Etudier les types d'opérations sur les bits, le format et la logique des instructions logiques de l'assembleur ;

3. Résoudre un problème individuel sur l'utilisation de sous-programmes en assembleur ;

4 .. Formuler une conclusion sur le travail effectué.

1 PARTIE THÉORIQUE

Comprendre le langage d'assemblage

Assembler est un langage de programmation de bas niveau qui est un format lisible par l'homme pour écrire des instructions machine.

Les instructions du langage assembleur correspondent une à une aux instructions du processeur et, en fait, représentent une notation symbolique pratique (code mnémonique) des commandes et de leurs arguments. De plus, le langage assembleur fournit des abstractions logicielles de base : lier des parties du programme et des données par le biais d'étiquettes avec des noms symboliques et des directives.

Les directives assembleur vous permettent d'inclure des blocs de données (décrits explicitement ou lus à partir d'un fichier) dans le programme ; répéter un certain fragment un nombre spécifié de fois ; compiler un fragment de manière conditionnelle ; définir l'adresse d'exécution du fragment, modifier les valeurs des étiquettes pendant le processus de compilation ; utiliser des macros avec des paramètres, etc.

Avantages et inconvénients

· La quantité minimale de code redondant (utilisant moins d'instructions et d'accès mémoire). En conséquence - une vitesse plus élevée et une taille de programme plus petite ;

· De grandes quantités de code, un grand nombre de petites tâches supplémentaires ;

· Mauvaise lisibilité du code, difficulté de maintenance (débogage, ajout de fonctionnalités) ;

· La difficulté de mettre en œuvre des paradigmes de programmation et toutes autres conventions plus complexes, la complexité du développement conjoint ;

· Moins de bibliothèques disponibles, leur faible compatibilité ;

· Accès direct au matériel : ports d'entrée-sortie, registres spéciaux du processeur ;

· « ajustement » maximal pour la plate-forme souhaitée (utilisation d'instructions spéciales, caractéristiques techniques du « matériel »);

· Intolérance aux autres plateformes (sauf compatible binaire).

En plus des instructions, un programme peut contenir des directives : des commandes qui ne se traduisent pas directement en instructions machine, mais contrôlent le fonctionnement du compilateur. Leur ensemble et leur syntaxe varient considérablement et ne dépendent pas de la plate-forme matérielle, mais du compilateur utilisé (donnant lieu à des dialectes de langages au sein d'une même famille d'architectures). Comme ensemble de directives, on peut distinguer :

· Définition des données (constantes et variables);

· Gestion de l'organisation du programme en mémoire et des paramètres du fichier de sortie ;

· Paramétrage du mode de fonctionnement du compilateur ;

· Toutes sortes d'abstractions (c'est-à-dire des éléments de langages de haut niveau) - de la conception de procédures et de fonctions (pour simplifier la mise en œuvre du paradigme de programmation procédurale) aux structures et boucles conditionnelles (pour le paradigme de programmation structurée);

· Macro.

Jeu de commandes

Les commandes typiques du langage assembleur sont :

Commandes de transfert de données (mov, etc.)

Commandes arithmétiques (add, sub, imul, etc.)

Opérations logiques et au niveau du bit (or, and, xor, shr, etc.)

· Commandes pour contrôler l'exécution du programme (jmp, loop, ret, etc.)

Interruption des commandes d'appel (parfois appelées commandes de contrôle) : int

Commandes E/S vers les ports (in, out)

Les microcontrôleurs et les micro-ordinateurs sont également caractérisés par des commandes qui effectuent une vérification et une transition par condition, par exemple :

· Jne - déplacer s'il n'est pas égal ;

· Jge - saut si supérieur ou égal.



Vous avez aimé l'article ? Partagez-le