CHAPITRE 4      ELEMENTS DU LANGUAGE ASSEMBLEUR A86

Les lments de programmation
-----------------------------

Trois catgories se distinctent : les instructions, les instructions
d'allocation de donnes et les directives de l'assembleur. Une instruction
normale utilise un nombre (mnemonic) et un ou plusieurs oprandes pour 
spcifier l'instruction en language machine  gnrer. Une instruction 
d'allocation de donnes rserve l'espace mmoire et les donnes. Une 
directive assembleur donne un ordre spcial. La dernire catgorie
diffre des deux autres car les instructions ne spcifie pas le contenu
de la mmoire.


Exemple d'instructions
----------------------
MOV AX,BX
CALL SORT_PROCEDURE
ADD AL,7

Exemple d'allocation de donnes
-------------------------------
A_VARIABLE DW 0
DB 'HELLO'

Directives assembleur
---------------------
CODE SEGMENT
ITEM_COUNT EQU 5

-----------------------------------------------------------------------------


Les symboles sont les "words" (mots) du language A86. Tous ces symboles sont 
une collection de lettres et de nombres conscutifs avec des caractres 
spciaux '_' '@' '$' '?'.
Les symboles ne peuvent commencer avec des chiffres, tout ce qui commence 
avec un chiffre est un nombre. Les symboles peuvent commencer avec n'importe
quel caractre list. 

Les symboles rservs ont une signification particulire de construction 
pour l'assembleur : les instructions mnmoniques (MOV,CALL), les noms de
donnes (DB,STRUC), les noms de registre, les oprations...

Les nombres dans A86 sont exprims en dcimal, hexadcimal, octal ou
binaire ou dcimal "K". Ils doivent commencer avec un chiffre dcimal
et, except pour le dcimal et hexadcimal, doivent finir avec "x" suivie
par une lettre identifiant la base du nombre. Un nombre sans identificateur
est hexadciaml si le premier chiffre est 0; dcimal si le premier chiffre
est entre 1 et 9.

Exemple :

123 (dcimal) 
0AB (hexadcimal)
1776xQ (octal)
10100110xb (binaire)
32K  (dcimal - 32 fois 1024)

Les chanes sont des caractres ferms dans des guillemets. Exemple d'une
chane avec '1ere chaine' et "Bonjour". '1re chaine' est la rference. 

Un commentaire peut tre insr par le programmeur dans le fichier source.
La ligne est alors ignore de l'assembleur. La ligne commence toujours
par un point-virgule (;) et indique un commentaire jusqu' la fin de la 
ligne.

Exemple :

;Voici un commentaire
MOV AX,33 ; Je charge AX avec 33

-----------------------------------------------------------------------------

Les oprandes et le code
------------------------

Les oprandes sont les registres, les variables, les labels et les constantes

Registres
---------

Le 8086 possde 8 registres qui sont AX,BX,CX,DX,SI,DI,BP,SP.
Les quatres premiers sont diviss en 2 parties de 8 bits chacune.
AH,AL,BH,BL,CH,CL,DH,DL. AH est le registre du haut et AL celui du bas.

Il y a aussi 4 segments 16 Bits CS,DS,ES,SS utiliss pour adresser la  
mmoire.

Depuis le 80386, il y a en plus FS et GS et des 32-bits EAX,EBX,ECX,EDX
ESI,EDI,EBP, et ESP. Il faut possder un assembleur capable de gnerer du 
code 32 Bits (A386)


Variables
---------

Une variable est une unit de donne avec un nom qui rside dans une 
location prcise. La variable donne son contenu au moment o elle est
dfinie. Elles sont dfinies grce  l'instruction DB pour le byte et
DW pour les mots (WORD)

BYTE_VAR DB 0   ; byte variable.
WORD_VAR DW 0   ; word variable.

Labels
------

Un label est une rference o le programme peut retourner. Cela permet 
de structurer le listing et de crer des sous-programmes. Il est suivi
de deux-points (:)

LABEL_1:
LABEL_2: MOV AL,BL
JMP LABEL_1         ; Retourne  LABEL_1

ATTENTION: NE CONFONDEZ PAS LABELS ET VARIABLES - VOUS CREERIEZ DES
PROBLEMES DANS VOTRE PROGRAMME

Constantes
----------

La constante est une valeur numrique qui "dure". Par exemple, 123 et 
3+2-1 reprsente toutes les deux des constantes.

----------------------------------------------------------------------------
Generating Opcodes from General Purpose Mnemonics

My A86 assembly language is modeled after Intel's ASM86 language,
which uses general purpose mnemonics to represent classes of
machine instructions rather than having a different mnemonic for
each opcode.  For example, the MOV mnemonic is used for all of
the following: move byte register to byte register, load word
register from memory, load byte register with constant, move word
register to memory, move immediate value to word register, move
immediate value to memory, etc.  This feature saves you from
having to distinguish "move" from "load," "move constant" from
"move memory," "move byte" from "move word," etc.

Because the same general purpose mnemonic can apply to several
different machine opcodes, A86 uses the type information
associated with an instruction's operands in determining the
particular opcode to produce.  The type information associated
with instruction operands is also used to discover programmer
errors, such as attempting to move a word register to a byte
register.

The examples that follow illustrate the use of operand types in
generating machine opcodes and discovering programmer errors.  In
each of the examples, the MOV instruction produces a different
8086 opcode, or an error.  The symbols used in the examples are
assumed to be defined as follows: BVAR is a byte variable, WVAR
is a word variable, and LAB is a label.  As you examine these MOV
instructions, notice that, in each case, the operand on the right
is considered to be the source and the operand on the left is the
destination.  This is a general rule that applies to all
two-operand instruction statements.

MOV AX,BX     ; (8B) Move word register to word register.
MOV AX,BL     ; ERROR: Type conflict (word,byte).
MOV CX,5      ; (B9) Move constant to word register.
MOV BVAR,AL   ; (A0) Move AL register to byte in memory.
MOV AL,WVAR   ; ERROR: Type conflict (byte,word).
MOV LAB,5     ; ERROR: Can't use label/constant as dest. to MOV.
MOV WVAR,SI   ; (89) Move word register to word in memory.
MOV BL,1024   ; ERROR: Constant is too large to fit in a byte.


