Section courante

A propos

Section administrative du site

 Langage  Elément  Tutoriel  Emulateur  Annexe  Aide 
ABAP/4
Ada
Assembleur
Assembly & bytecode
ASP (Active Server Pages)
Basic
C
C++
C# (C Sharp)
Cobol
ColdFusion
Fortran
HTML
Java
JavaScript
LISP
Logo
LotusScript
Oberon
Pascal
Perl
PHP
PL/1
Prolog
Python
Rebol
REXX
Ruby
Rust
SAS
NoSQL
SQL
Swift
X++ (Axapta)
GNAT
SMALLAda
VHDL
Assembleur 370
Assembleur 1802
Assembleur 4004
Assembleur 6502
Assembleur 6800
Assembleur 68000
Assembleur 8080 et 8085
Assembleur 8089
Assembleur 80x86
Assembleur AGC4
Assembleur ARM
Assembleur DPS 8000
Assembleur i860
Assembleur Itanium
Assembleur MIPS
Assembleur PDP-11
Assembleur PowerPC
Assembleur RISC-V
Assembleur SPARC
Assembleur SuperH
Assembleur UNIVAC I
Assembleur VAX
Assembleur Z80
Assembleur Z8000
Assembleur z/Architecture
ASSEMBLER/MONITOR 64
Micol Assembler
GFA Assembler
A86
MASM (Macro Assembler)
TASM (Turbo Assembler)
CIL
Jasmin
LLVM
MSIL
Parrot
P-Code (PCode)
SWEET16
G-Pascal
ASP 1.0
ASP 2.0
ASP 3.0
ASP.NET
ASP.NET Core
ABasiC (Amiga)
Adam SmartBASIC
Altair BASIC
AmigaBASIC (Amiga)
AMOS Basic (Amiga)
Atari Basic (Atari 400, 600 XL, 800, 800XL)
Basic Apple II (Integer BASIC/APPLESOFT)
Basic Commodore 64 (CBM-BASIC)
Basic Commodore 128 (BASIC 7.0)
Basic Commodore VIC-20 (CBM-BASIC 2.0)
Basic Coco 1 (Color Basic)
Basic Coco 2 (Extended Color Basic)
Basic Coco 3 (Extended Color Basic 2.0)
BASICA (PC DOS)
Basic Pro
BBC BASIC
Blitz BASIC (Amiga)
DarkBASIC
Dartmouth BASIC
GFA-Basic (Atari ST/Amiga)
GWBASIC (MS-DOS)
Liberty BASIC
Locomotive BASIC (Amstrad CPC)
MSX-Basic
Omikron Basic (Atari ST)
Oric Extended Basic
Power Basic
Quick Basic/QBasic (MS-DOS)
Sinclair BASIC (ZX80, ZX81, ZX Spectrum)
ST BASIC (Atari ST)
Turbo Basic
Vintage BASIC
VBScript
Visual Basic (VB)
Visual Basic .NET (VB .NET)
Visual Basic pour DOS
Yabasic
BeckerBASIC
SIMONS' BASIC
Basic09 d'OS-9
Disk Extended Color Basic
Basic09 d'OS-9
Disk Extended Color Basic
Access
Excel
Visual Basic pour Windows
Visual Basic .NET pour Windows
C Shell Unix (csh)
C pour Amiga
C pour Atari ST
C pour DOS
C pour Falcon030
C pour GEMDOS (Atari ST)
C pour Linux
C pour PowerTV OS
C pour OS/2
C pour Unix
C pour Windows
Aztec C
CoCo-C
GNU C
HiSoft C
IBM C/2
Introl-C
Lattice C
Microsoft C
MinGW C
MSX-C
Open Watcom C
OS-9 C Compiler
Pure C
Quick C
Turbo C
HiSoft C for Atari ST
HiSoft C for CP/M (Amstrad CPC)
C++ pour OS/2
C++ pour Windows
Borland C++
C++Builder
IBM VisualAge C++
Intel C++
MinGW C++
Open Watcom C++
Symantec C++
Turbo C++
Visual C++
Visual C++ .NET
Watcom C++
Zortech C++
C# (C Sharp) pour Windows
Apple III Cobol
Microsoft Cobol
BlueDragon
Lucee
OpenBD
Railo
Smith Project
Microsoft Fortran
WATFOR-77
CSS
FBML
Open Graph
SVG
XML
XSL/XSLT
LESS
SASS
GCJ (GNU)
JSP
Jython
Visual J++
Node.js
TypeScript
AutoLISP
ACSLogo
LotusScript pour Windows
Amiga Oberon
Oberon .NET
Apple Pascal
Delphi/Kylix/Lazarus
Free Pascal
GNU Pascal
HighSpeed Pascal
IBM Personal Computer Pascal
Lisa Pascal
Maxon Pascal
MPW Pascal
OS-9 Pascal
OSS Personal Pascal
Pascal-86
Pascal du Cray Research
Pascal/VS
Pascal-XT
PURE Pascal
QuickPascal
RemObjets Chrome
Sun Pascal
THINK Pascal
Tiny Pascal (TRS-80)
Turbo Pascal
UCSD Pascal
VAX Pascal
Virtual Pascal
Turbo Pascal for CP/M-80
Turbo Pascal for DOS
Turbo Pascal for Macintosh
Turbo Pascal for Windows
CodeIgniter (Cadre d'application)
Drupal (Projet)
Joomla! (Projet)
Phalanger (PHP .NET)
phpBB (Projet)
Smarty (balise)
Twig (balise)
Symfony (Cadre d'application)
WordPress (Projet)
Zend (Cadre d'application)
PL360
PL/M-80
PL/M-86
Turbo Prolog
CPython
IronPython
Jython
PyPy
AREXX
Regina REXX
JMP
Btrieve
Cassandra
Clipper
CouchDB
dBASE
Hbase
Hypertable
MongoDB
Redis
Access
BigQuery
DB2
H2
Interbase
MySQL
Oracle
PostgreSQL
SAP HANA
SQL Server
Sybase
U-SQL
Référence des mots réservés (mots clefs)
Référence des procédures et des fonctions
Un aperçu du système OS-9 Pascal
L'interpréteur P-Code
L'éditeur de liaison OS-9 Pascal
Fonctions et procédures d'entrée/sortie OS-9 Pascal
Gestion des erreurs d'exécution
Écriture des procédures de langage assembleur
Conformité aux normes ISO
VCC
Références des codes d'erreur du OS-9 Pascal
Préface
Notes légal
Dictionnaire
Recherche

Écriture des procédures de langage assembleur

Le OS-9 Pascal offre la possibilité d'écrire manuellement des procédures externes (c'est-à-dire des PROCEDURE et FUNCTION du OS-9 Pascal) en langage assembleur. Il peut également vous aider à comprendre le type de code natif produit par PascalT, le convertisseur de code natif. Il suppose que vous comprenez le langage d'assemblage 6809, la programmation en langage de programmation assembleur sous OS-9 et l'utilisation de la mémoire OS-9 Pascal.

Espace de variable : empiler les cadres et empiler les marques

Tout l'entreposage de variables utilisé par un appel de procédure est alloué dans une section de la pile OS-9 Pascal appelée «cadre de pile». Un cadre de pile se compose des trois composantes suivantes : une marque de pile, des variables locales et la pile étendue. Tous les paramètres devant être passés à une procédure font partie de la pile étendue de la procédure appelante. Supposons que la procédure Q soit déclarée comme ceci :

FUNCTION Q(i: real; var j: real; ch: char):integer;

Ensuite, pour appeler Q, la procédure appelante doit effectuer les opérations suivantes dans l'ordre indiqué :

A l'entrée dans la procédure Q, la pile ressemble à la figure suivante et le registre B contient le numéro de la procédure appelée :

La procédure Q termine ensuite la marque de pile de 7 octets et effectue une autre configuration avec le code suivant :

  1. PROCQ LDA PROCN           ; CHARGER AVEC NUMÉRO DE PROCÉDURE D'APPEL
  2.       STB PROCN           ; ENREGISTRER LA PROCÉDURE APPELÉE NUMÉRO
  3.       PSHS A              ; EMPILE LA PROCÉDURE D'APPEL NUMÉRO
  4.       PSHS U              ; ENREGISTRER LA COPIE ACTUELLE DU REGISTRE U
  5.       LEAU ,S             ; NOUVELLE VALEUR DU REGISTRE U
  6.       LEAX -locsize,S     ; REGISTRE DE POINTS X AU BAS DE LA PILE REQUIS
  7.       PSHS X              ; EMPILE PARAM POUR APPEL SUBR
  8.       LDD #extsize       ; CHARGE LE REGISTRE D AVEC UNE TAILLE DE PILE ÉTENDUE
  9.       LDX SUPJTBL         ; OBTENIR LE PAQUET DE SUPPORT D'ADRESSE
  10.       JSR STACKCHK,X      ; PILER VÉRIFIER ET METTRE À JOUR LE POINTEUR DE PILE
  11.       LDD DHOLD           ; OBTENIR LA VALEUR ACTUELLE DE DHOLD
  12.       PSHS D              ; ENREGISTRER LA COPIE SUR LA PILE

Le code illustré précédent est pratiquement identique pour chaque entrée de procédure. Le seul changement d'une procédure à l'autre est l'étiquette de la première ligne, la valeur de «locsize» et la valeur de «extsize». Il y a 3 variables entreposées dans la page zéro (c'est-à-dire dans la page de base) devant être utilisées ou maintenues par chaque procédure. La variable PROCN est le numéro de procédure courante d'un octet. Cette variable doit à tout moment indiquer le numéro de procédure comme indiqué dans le tableau des procédures de la procédure en cours d'exécution. La variable SUPJTBL contient une adresse mémoire absolue d'un point connu dans le paquet de support. Si le registre X du 6809 est chargé avec cette valeur, une instruction 'JSR subr,X', où' subr' est le nom d'un sous-programme de paquet de support tel que défini dans le fichier PASCALDEFS, utilisera l'appel de sous-programme approprié pour tout sous-programme de support. La variable DHOLD contient une valeur de 16 bits devant être sauvegardée localement à chaque entrée de procédure et restaurée à chaque sortie de procédure. La valeur de 'locsize' est, bien sûr, la taille indiquée dans la liste du tableau des procédures pour la taille de la pile locale de la procédure. Après avoir exécuté le code précédent, la marque de pile de 7 octets est terminée. La forme et le contenu d'une marque de pile sont les suivantes :

La figure suivante montre la forme et le contenu de la pile et où les registres U et S pointent après qu'un appel est fait à une procédure et que le code d'entrée de procédure a été exécuté :

Les références à la plupart des données se font via le registre U. Les paramètres passés et la zone de résultat de la fonction sont à un déplacement positif à partir de U, tandis que les variables locales sont à un déplacement négatif à partir de U. Le dernier paramètre passé est entreposé à partir du déplacement «7, U» pour son octet le plus significatif. La première variable locale est entreposée à un déplacement de -1U pour son octet le moins significatif. Pour accéder aux données dans des niveaux de procédures lexiquement plus élevés, c'est-à-dire dans les procédures d'appel, vous devez effectuer une opération «basex». Un basex est fait en gravissant les marques de pile pour trouver l'adresse de la zone de données locale de la procédure appropriée. L'adresse des données locales de la procédure d'appel immédiat se trouve dans les 5ième et 6ième octets de la marque de pile actuelle, comme illustré dans l'avant dernier illustration. Si vous vouliez accéder à une variable de 2 octets qui se trouve à un déplacement de -17 dans la zone de données locale de la procédure appelante, le code suivant serait utilisé :

  1. LDX 5 ,U        ; BASEX MONTE DE 1 NIVEAU
  2. LDD -17,X       ; DEMANDE 2B DE LA REGION D'APPEL PROCEDURE

De même, pour accéder aux données d'une procédure étant lexicalement deux niveaux plus haut (c'est-à-dire la procédure ayant appelé la procédure ayant appelé la procédure courante), deux opérations basex doivent être effectuées.

  1. LDX 5 ,U            ; BASEX MONTE UN 1 NIVEAU
  2. LDX 5,X             ; BASEX MONTE PLUS DE 1 NIVEAU
  3. LDD -displacement,X ; DEMANDE 2B DE DONNEES

Pour accéder aux données dans la zone globale, c'est-à-dire les données déclarées dans le bloc externe, ne nécessite pas d'opérations basex pour atteindre le niveau approprié - le registre Y pointe toujours vers le haut de la zone globale. A un déplacement nul ou positif par rapport à Y se trouve la zone système contenant plusieurs pointeurs, tampons, zones de travail et mémoire de tas. À un déplacement négatif de Y se trouvent les données locales du bloc externe - la zone de données globale. Le tableau suivant montre le contenu du registre et son utilisation pour les procédures s'exécutant dans un environnement OS-9 Pascal :

Registres Utilisation
A Disponible
B Disponible
X Disponible, également utilisé pour les opérations basex et d'indexation générale.
Y Pointe vers le haut de global, également le premier octet de la zone système.
U Pointe vers le haut de local, également le premier octet de la marque de pile actuelle.
S Pointe vers le haut actuel de la pile. Les piles sont construites en descendant dans la mémoire.
DP Pointe vers la zone de données de la page zéro. Cette zone ne doit jamais être utilisée par un programme utilisateur ou une procédure pour ses propres données - le paquet de support OS-9 Pascal gère cette zone.

Les registres Y, U, S et DP ne doivent normalement jamais être utilisés autrement que comme indiqué sur le tableau précédent. S'ils sont modifiés à tout moment, ils doivent être restaurés avant que des appels ne soient effectués au sous-programme ou avant que la procédure ne s'arrête ou n'appelle autre procédure.

Appel d'autres procédures OS-9 Pascal

Pour appeler une autre procédure OS-9 Pascal, les étapes suivantes doivent être effectuées dans l'ordre indiqué :

Enfin, pour quitter une procédure, utilisez le code ci-dessous :

  1. PULS D       ; RESTAURER LA COPIE ENREGISTRÉE DE DHOLD
  2. STD DHOLD   
  3. LEAS , U     ; POINT DU REGISTRE S AU BAS DE LA MARQUE DE PILE
  4. PULS U       ; RESTAURER LE REGISTRE U DE L'APPELANT
  5. PULS A,X     ; DEMANDE LE NUMERO D'APPEL ET RETOURNE L'ADRESSE
  6. STA PROCN    ; RESTAURER LE NUMERO DE PROCÉDURE ACTUELLE
  7. LEAS 2+paramsize,S  ; SUPPRIMER LES 2 DERNIERS OCTETS DU MARQUEUR DE PILE ET TOUT PARAMETRE PASSE DE LA PILE
  8. JMP ,X  ; REVENIR À LA PROCEDURE D'APPEL


PARTAGER CETTE PAGE SUR
Dernière mise à jour : Samedi, le 11 juillet 2020