Le tutorial suivant est tiré du site : http://www.chez.com/pageasm/tutd/base/index.htm
Vous pouvez trouver l'archive du document dont le tutorial fait référence à l'adresse :
http://www.chez.com/pageasm/dos-tuts-base.exe
Les Registres
Les Registres du 286
L'instruction MOV
Les instructions ADD et SUB
Les instructions PUSH et POP
L'instruction INT
Les Registres
Le processeur possède des variables internes appelées registres. Ils sont directement dans le
processeur et sont utilisés par les instructions. Il y a des registres 8 bits, 16 bits et 32 bits (et
maintenant 64 bits avec le MMX), mais nous ne verrons que les deux premiers, c'est préférable
pour maintenant.
Bits
Possibilités
Non Signé
Signé
8
2^8=256
0..255
-127..128
16
2^16=65536
0..65535
-32768..32767
32
2^32=4294967296
0..4294967295
-2147483647..2147483648
64
2^64 = 1.84e+19
0..1.84e+19
-9,22e+18..9,22e+18
Les registres de base sont ax, bx, cx et dx. Ce sont des registres 16 bits et leur partie basse de 8
bits sont dans al, bl, cl et dl, et leur partie haute dans ah, bh, ch et dh. Si ax est nul alors al est nul
et ah aussi. Lorsque vous modifiez ax, vous modifiez al et ah. Lorsque vous modifiez al, vous
modifiez ax mais pas ah.
al = 15
ah = 10
=> ax = al + ah*256 = 15 + 10*256 = 2575
Les autres registres sont si, di, bp et sp: ils sont utilisés pour les transferts mémoire. ds, es, ss et
cs sont les registres de segment utilisés pour l'adressage. (Nous verrons tout cela avec plus de
détails plus tard).
Les Registres du 286
Registre
Bits 8..15
Fonction
AX
AH
Accumulator
BX
BH
Base
CX
CH
Count
DX
DH
Data
SI
-
Source Increment
DI
-
Destination
Increment
SP
-
Stack Pointer
BP
-
Base Pointer
CS
-
Code Segment
DS
-
Data Segment
SS
-
Stack Segment
ES
-
Extra Segment
IP
-
Instruction Pointer
Flags
-
Flag Register
MSW
-
Control Register
L'instruction MOV
mov operand, operand
MOV copie la seconde opérante vers la première. L'opérante peut être un registre (reg), une
référence mémoire (mem), ou une immédiate (imm). Une référence mémoire est une variable ou
une adresse. Une immédiate est un nombre direct.
Exemples:
mov ax, bx ; (reg, reg) est équivalent à ax = bx
mov ax, 3 ; (reg, imm) est équivalent à ax = 3
mov ax, Var1 ; (reg, mem) est équivalent à ax = Var1
Certaines combinaisons d'opérantes sont interdites:
mov es, ds ; (registre de segment -> registre de segment)
mov es, 3 ; (registre de segment -> immédiate)
mov Var0, Var1 ; (référence mémoire -> référence mémoire)
Les instructions ADD et SUB
add operand, operand
sub operand, operand
ADD effectue l'addition des deux opérantes. Lesultat est assigné à la première opérante, et les
flags sont modifiés en conséquence. Nous expliquerons le fonctionnement des flags plus tard.
SUB soustrait la deuxième opérante à la première. Le résultat est assigné à la première opérante,
et les flags sont modifiés en conséquence.
ADD et SUB ont les mêmes combinaisons d'opérandes que MOV.
Exemples:
add ax, bx ; (reg, reg) est équivalent à ax = ax + bx
add dx, 3 ; (reg, imm) est équivalent à dx = dx + 3
sub si, Var ; (reg, mem) est équivalent à si = si - Var
sub cx, [si] ; (reg, mem) est équivalent à cx = cx - [si]
Les instructions PUSH et POP
push operand
pop operand
PUSH sauve l'opérante dans le stack (ou pile).
POP récupère l'opérante dans le stack.
L'opérante doit être 16 bits.
Exemples:
mov ax, 3 ; ax = 3
mov bx, 5 ; bx = 5
push ax ; sauve 3 dans le stack
pop bx ; récupère 3 dans le stack: à présent bx = 3
mov ax, 12 ; ax = 12
mov bx, 7 ; cx = 7
mov cx, 24 ; bx = 24
push ax ; sauve 12 dans le stack
push bx ; sauve 7 dans le stack
mov dx, 67 ; dx = 67
pop cx ; récupère 7 dans le stack: à présent cx = 7
pop dx ; récupère 12 dans le stack: à présent dx = 12
L'instruction INT
int immediate
INT génère via le software un appel vers un handle d'interruption. L'immédiate, de 0 à 255,
donne le numéro de l'interruption à appeler dans la table des descripteurs d'interruption (IDT).
Plus simplement, INT appelle des procédures en mémoire, mais ces procédures ne font pas
parties du programme, ce sont généralement des procédures BIOS ou DOS. Par exemple, int 21h
appelle l'interruption DOS. ("h" après signifie hexadécimal: 21h = 33 décimal)
Exemple: La Fonction 4ch de l'interruption DOS termine un programme:
mov ah, 4ch ; fonction 4ch
int 21h ; interruption DOS -> Retour au DOS
Premier Programme
Logiciel Requis
Le programme
Les segments
Logiciel Requis
Ce programme requiert un compilateur TASM ou MASM, et un lieur comme TLINK. J'utilise le
Borland Turbo Assembler 4.0 avec TASM.EXE et TLINK.EXE.
Pour compiler, tapez:
tasm start
tlink start
start
Ce premier programme va juste afficher à l'écran 'Hello World!'
Le programme
Le programme s'appelle "START.ASM" et se trouve dans l'archive qui accompagne ce Tutoriel.
Les segments
Les segments constituent la structure du programme. Généralement, il y a un segment de code,
un segment de data (données) et un segment de stack (pile). Le segment de code est utilisé pour
les instructions, le segment de data pour les variables, et le segment de stack pour les instructions
de stack comme push et pop.
Déclaration générale d'un segment:
"nom" segment [public|stack]
...Instructions ou données...
"nom" ends
L'instruction ASSUME informe TASM de l'utilisation courante du registre de segment. Code16
est un segment de code, donc cs est assumé à code16. Data16 est un segment de data, donc ds est
assumé à data16. Stack16 est un segment de stack, donc ss est assumé à stack16. Au démarrage,
le DOS adapte cs (registre du segment de code) et ss (registre du segment de stack) mais pas ds
(registre du segment de data). Donc vous devez adapter ds ou vous risquez d'avoir des surprises.
Adapter le registre de data:
mov ax, data16 ; on utilise ax parcequ'on ne peut pas écrire
; 'mov ds, data16': data16 est une immédiate
mov ds, ax ; A présent ds est adapté
Le segment de stack et le segment de data sont des segments pour les données. Mais le segment
de stack est une zone de mémoire temporaire pour push ou pop, c'est la raison pour laquelle il n'y
a qu'un blanc d'octets. Le segment de data peut contenir des constantes et des variables. Dans cet
exemple, 'Hello' est une constante sous la forme d'une chaîne. Dans le programme, nous plaçons
l'offset de 'Hello' dans dx parceque l'interruption DOS requiert un offset pour afficher un texte à
l'écran. 'Hello' est la première variable donc son offset est 0.
Déclaration des données:
"nom" db ? ; Variable 8 bits: Byte
"nom" dw ? ; Variable 16 bits: Word
"nom" dd ? ; Variable 32 bits: Dword
"nom" db ?,? ; Deux Bytes
"nom" dw ?,?,?,? ; Quatre Words
"nom" db 'Hello' ; Chaîne de Bytes
"nom" dw 32 dup (?) ; 32 Words
Ne vous inquiétez pas si vous ne comprenez pas tout, retapez juste l'exemple et conservez
l'essentiel.
Sauts Conditionnels
Sauts Conditionnels
Table des Sauts
Programme d'exemple
Sauts Conditionnels
1 / 14 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !