• Aucun résultat trouvé

De xièe aie gaai yèe  :

N/A
N/A
Protected

Academic year: 2022

Partager "De xièe aie gaai yèe  : "

Copied!
48
0
0

Texte intégral

(1)

Programmation système I : le mode

réel

(2)
(3)

Nous avons vu dans la premièrepartie omment érire des programmes d'

hh

appliation

ii

,

'est-à-dire s'exéutant sur un système d'exploitation. Nous allons voir maintenant omment

démarrerunmiroproesseurenmode64bits.

Ledémarraged'unmiroproesseurIntelàarhiteturex86-64ressembleaulanementd'une

fuséeàtrois étages:

Lorsd'une réinitialisation, untel miroproesseur setrouve dansun ertain état: Intel

parledemode,etdemode réelpourepremiermode.

Ce mode est ompatible ave un 8086, 'est-à-dire qu'un programme érit en ode

mahinepourunmiroproesseur8086s'yexéutera.

Cei n'empêhe pas l'existene d'instrutions nouvelles, parrapport au 8086,exéu-

tablesdansemode.

Uneinstrutiondetransfertmovversunnouveauregistre('est-à-direquin'existepassur

le8086),deapaité32bitsalorsquelesregistresdu8086onttousunetaillede16bits,

appelé CR0pourControl Register,permet depasser aumode protégé, qui estle mode

parexellene desmiroproesseursInteld'arhiteture IA-32,ave32pour32bits.

Cettevariante del'instrutionmovnes'exéutepassurun8086:nousvoyonsdonlà

unedesinstrutionsnouvelles.Lemodeprotégéexigel'initialisationd'unertainnombre

detablespourfontionner,equinepeutdons'eetuerqu'enmoderéel,d'oùlanéessité

d'autresnouvellesinstrutions.

Unefoisenmodeprotégéonpeut,sionledésire,pourunmiroproesseurd'arhiteture

x86-64ouIA-32e(aveun`e'pourExtended),maispasavel'arhitetureIA-32,passer

dansunnouveaumode,appelé mode long,omportantdeuxsous-modes,dontl'un est

appelé mode 64 bits.

Bibliographie

PatrikCégielski,Coneptiondessystèmesd'exploitation:Leaslinux.Deuxième

(4)
(5)

Le mode réel

Nous avons vu que, lorsd'une réinitialisation, un miroproesseur Intel setrouvetoujours

danslemode réel.Commençons,dansehapitre,pardérirelemoderéel.

(6)

7.1 Caratéristiques du mode réel

Iln'yarienàdiresurlemode réelpourlesmiroproesseurs8086/8088ou80186:'estle

seulmodedanslequelilspeuventfontionner,étudiéparexempledans:

https://www.lal.fr/egielski/miro.html

Ilexistequelquesinstrutionsnouvellespourle80286,permettantlepassageaumodeprotégé.

Mais'estsurtoutàpartirdu80386qu'unhangementintervient.

Le fontionnement en mode réel est identiqueà elui des 8086/8088en e qui onerne la

manièred'interpréter lesadresseset de prendreen ompteles interruptions.L'espaemémoire

disponibleestlimité à1MiO.Un déplaementnepeutpasdépasser

±

64KiO,taillemaximale

d'unsegmentdansemode.

Parontreonpeututiliserlesnouveauxregistres32bitspourlesdonnéesetutiliserertaines

desnouvellesinstrutions,parexempleellesportantsurletraitementdeshaînesdebits.

Commençonsparvoirlesregistres32bits.

7.2 Les registres 32 bits en arhiteture IA-32

Intel a onçu un ertain nombre de miroproesseurs32 bits : le 80386en premier puis le

80486,lepentiumetd'autres.Dupointdevueduprogrammeur,onparled'arhitetureIA-32

puisquelesprogrammess'exéutentindiéremmentsurl'un oul'autredees miroproesseurs,

yomprissurlesmiroproesseursx86-64.

Commepourun8086,il existetroistypesderegistresinternes:

lesregistresd'usagegénéral,dits aussiregistresgénéraux;

lesregistresdesegment;

lesregistresspéiaux.

7.2.1 Les registres généraux

Unediéreneaveun8086estlaapaitéplusélevéedesregistresgénéraux.Parontreily

enalemêmenombre,huit,quesurle8086:

31 16 15 8 7 0

AH A X AL EAX

BH B X BL EBX

CH C X CL ECX

DH D X DL EDX

SI ESI

DI EDI

BP EBP

SP ESP

Onretrouvelesnomsdesregistresdu8086aveunsue`E'(pourExtended)pourunetaille

de32bits.OnpeutaéderaumotdepoidsfaibledeeshuitregistresEAX,EBX,ECX,EDX,ESI,

EDI,EBPetESPsouslesnomsonnuspourle8086,àsavoirAX,BX,CX,DX,SI,DI,BPet SP.On

peutaéderauxotets,depoidsfaibleetdepoidsfort,desquatrepremiersregistresAX,BX,CX

(7)

7.2.2 Les registres spéiaux

Lepointeurd'instrution.- Le pointeur d'instrution, maintenant appelé EIP (pour Extended

IP),estégalementétenduà32bits:

31 16 15 0

IP EIP

Ilontientàtout momentle déalagede laprohaineinstrution àexéuter.Cependant,seuls

les16premiersbitssontutilisésenmoderéel.

Leregistredesindiateursd'états.- Là enore, le registre des indiateurs, maintenant appelé

EFlags(pourExtendedFlags),est étenduà32bits:

31 16 15 0

Flags EFlags

maisseulsles16premiersbitssontdisponiblesenmoderéel.

Lesindiateurssontlessuivants:

17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

V R 0 N I O D I T S Z 0 A 0 P 1 C

M F T O F F F F F F F F F

P

L

Seuls lesindiateursCF(CarryFlag), PF(Parity Flag), AF(Auxiliary Flag),ZF(ZeroFlag),

SF(Sign Flag),TF (Trap Flag),IF(Interrupt Flag),DF (Diretion Flag)et OF(Overow Flag),

déjàprésentssurle8086,ontunsensenmoderéel.

Autresregistresspéiaux.-Nousverrons,àproposdupassageaumodeprotégé,qu'ilexisted'au-

tresregistresspéiauxaessiblesenmoderéel,maisutilesuniquementpourlepassageaumode

protégé.

7.2.3 Six registres de segment

La largeurdes registresde segment, àsavoir16 bits, n'a pashangée parrapport au8086.

Parontreilyenadeuxdeplus:FSetGSenplusdeCS,SS,DSetES.Cesnouveauxregistres

desegmentserventàhargerdessegmentsdedonnées,tout ommeDSetES.

7.2.4 Types de données

Lestroistaillesdesdonnéesélémentairessont:

l'otetdehuit bits,

lemotdeseizebits(deuxotets),

lemot doubledetrente-deuxbits(quatreotetsoudeux mots).

Intel aneette lassiationet donne desnoms àde nombreux typesde données,dontle

(8)

7.3 Les instrutions

7.3.1 Noms des instrutions en langage symbolique

Lejeud'instrutions peutêtresubdiviséenneufatégoriesfontionnelles:

transfertdedonnées;

opérationsarithmétiques;

déalageetrotations;

traitementdeshaînesdearatères;

traitementdesbits;

supportdeslangagesdehautniveau;

supportdessystèmesd'exploitation;

ontrleduproesseur.

La plupart de es instrutions sont déjà présentes sur le 8086. Nous ne détaillerons pas la

sémantiquedeelles-i.LalistedesnomsdesinstrutionsenlangagesymboliqueIntelestdonnée

enappendie.

(9)

7.3.2 Les modes d'adressage

Le nom symbolique du ode opération (opode) d'une instrution est suivi des opérandes,

dontlaformeesttrèsvariée:

Dansl'adressageimmédiat,l'opérandeoul'undesopérandesestuneonstante(inter-

prétéeommeunentier),l'autre opérandeéventuelfaisantpartieduodeopération,par

exemple:

IMUL EBX,5

ennotationIntelet :

IMUL $5,%EBX

ennotationAT&T.

Laonstanteestiiunentierrelatif(equ'indiquele`i'dunomsymbolique),odésur

32bits(d'aprèslenomduregistre).

Dansl'adressage à registre,l'opérande est unregistreoules deuxopérandes sontdes

registres,parexemple:

INC EAX

ennotationIntelet:

INCL %EAX

ennotationAT&T.

La taille de l'opérande est préisée par le nom du registre en notation Intel. Il y a

redondaneennotationAT&Tpuisquelesuxe`l'lepréiseégalement.

Évidemment les deux registresdoivent êtrede même taille dans leas de deux opé-

randes.

Onparled'adressageà mémoiredanslesautresas,'est-à-direlorsqu'un élémentde

lamémoireviveestimpliqué.Ilexisteneufas:

Dansl'adressagediret,ledéalagedel'adresseestundéplaement(displaement

oudistane enanglais),'est-à-direunevaleurimmédiate signéesur8,16ou 32bits,

parexemple:

INC word ptr [500℄

ennotationIntel.

On a besoin, en notation Intel, de l'un des préxes byte ptr, word ptr ou, e

quiestnouveauàl'arhitetureIA-32,doubleword ptrenlangagesymboliquepour

spéier la taille de l'opérande (les odes opération en langage mahine, eux, sont

diérents).

En notationAT&T,onérit:

INCL 500

sansle signe`$',qui désigneuneonstante et non une adresse, 'estle suxe `l' qui

préiselataille.

Dansl'adressageindiretparregistre,ledéalageestleontenud'unregistre,par

exemple:

MOV [ECX℄,EDX

en notation Intel,où l'adresse est le ontenu du registreECXet lataille est spéiée

parleseondopérande(leregistreEDX).

En notationAT&T,onérit:

MOVL %EDX,(%BX)

(10)

LeregistredesegmentpardéfautpourBPestSSetDSpourlesautresregistres.On

peut,ependant,hangeresegmentpardéfaut parunautresegmentenutilisantun

préxe de segment,enérivant,parexemple:

MOV AX,FS:[ECX℄

ennotationIntelet:

MOVW %FS:(%ECX),%AX

ennotationAT&T.

Dansl'adressageparbase,leontenud'unregistre,ditregistredebase,estajouté

àundéplaementpourobtenirledéalage,ommedans:

MOV ECX,[EAX+24℄

ennotationIntelet:

MOVL 24(%EAX),%ECX

ennotationAT&T.

Lasémantiquedel'adressageparindex,lorsqueelui-iestutiliséseul,ressembleà

l'adressage parbase: ledéalageest lasommed'un déplaementet duontenud'un

registre.Onutilise l'undesregistresSIouDIdans leasdumoderéel.

Si lasémantiqueestpresquelamêmequepourl'adressageparbase,lasyntaxeen

langagesymboliqueIntel,elle,estdiérente :

MOV ECX,24[SI℄

Dans l'adressage par base et index, le déalage est obtenu omme somme des

ontenusd'unregistredebaseet d'unregistred'index:

MOV ECX,[SI℄[BX℄

Pour résumer, en mode réel,une adresse est obtenue en spéiant un registre de segment

et un déalage : elle est égaleà 16 fois le ontenu du registrede segment plusle déalage. Le

déalageestaluléenfontiondumoded'adressagepar:

AE = [Base℄ + [Index℄ + Déplaement

Plus préisément,ona:

BX

BP

+

SI

DI

+

Déplaement(0, 8ou16bits)

(11)

7.3.3 Codage des instrutions

7.3.3.1 Format d'une instrution

Leformatdesinstrutionsdu8086,àsavoir:

Préxed'instrution Préedesegment

Opode modr/m Déplaement Données

seomplique etomportemaintenantde1à16otetssuivantleformatsuivant:

Préed'instrution Préed'adresse Préxederegistre Préxedesegment

Opode mod r/m SIB Déplaement Données

Lepréxe d'instrutionéventuel,déjàonnudu8086,sertàrépéterertainesinstru-

tionsouaubloage:

Préxe Signiation

0xF3 RépétitionREPd'uneopérationsurleshaînesdearatères

0xF3 RépétitionREPE/REPZd'uneopérationsurleshaînesdearatères

0xF2 RépétitionREPNE/REPNZ d'uneopérationsurleshaînesdearatères

0xF0 PréxepourLOCK

Lataille d'uneonstante est pardéfautde16 bitsen moderéel.Si lepréxe de taille

de onstante,égalà0x67,estprésentalorselleest de32bits.

La taille d'un registre est par défaut de 16 (ou 8) bits en mode réel.Si le préxe de

registre, égal à 0x66, est présent alors elle est de 32 bits. C'est la façon d'indiquer

(12)

Onretrouvelesvaleursdupréxe dehangementde segmentéventueldu8086plus

deuxnouvellespourlessegmentsFSet GS:

Préxe Segmentsous-jaent

0x2E CS

0x36 SS

0x3E DS

0x26 ES

0x64 FS

0x65 GS

Lesodesopération(opode),deunoudeuxotets,sontlesmêmesquepourle8086pour

lesinstrutionsqui existaientdéjà enlangage symbolique.Nousen donnons ledétailen

appendie.

L'otetéventuelmodr/m(moderegistre/mémoire)alamêmestruturequepourle8086:

7 6 5 4 3 2 1 0

MOD REG/opode R/M

Ilspéielaformedel'adresseutiliséeet omplèteéventuellementleodeopération.

Ledéplaement(signé)éventueloupe8,16ou32bits.

Satailleestpréiséeparl'otetModR/M,delafaçonindiquéei-dessous.

Unopérandeimmédiat(nonsigné)éventueloupeégalement8,16ou32bits.

SatailleestpréiséeparlebitWduodeopération(8 ou16/32)et parlapréseneou

(13)

7.3.3.2 Signiationde l'otetmodr/m

LehampMOD.-LehampMODspéie lemoded'adressagedel'instrution:

MOD Fontion

00 Pasdedéplaement(saufsiR/M = 110b)

01 Déplaementsur8bits

10 Déplaementsur16bits

11 R/Mest unregistre

dansleasdumode16bits.

Ledéplaementsur16bits(MOD = 10b)devientundéplaementsur32bitsdansleasoùle

préxe0x67detailled'adresseest utilisé.

Ledéplaementestunentierrelatif.

Désignationduregistre.-LepremierotetduodeopérationspéiesilehampREGdésignela

suitedu ode opérationou unregistre.Lorsqu'il s'agitd'un registre,lasigniation duhamp

REGde3bits(etlehampR/Mlorsque MOD = 11b)estdonnéeparletableausuivant:

Valeur W = 0 W = 1

sanspréxe 0x66 avepréxe 0x66

000 AL AX EAX

001 CL CX ECX

010 DL DX EDX

011 BL BX EBX

100 AH SP ESP

101 CH BP EBP

110 DH SI ESI

111 BH DI EDI

L'otetmodr/mpourl'adressagesur16bits .-Laasigniationdel'otetmod r/mpourl'adres-

sagesur16bits est:

r/m Adresseeetive

mod = 00 mod = 01 mod = 10

000 [BX + SI℄ [BX + SI℄ + disp8 [BX + SI℄ + disp16

001 [BX + DI℄ [BX + DI℄ + disp8 [BX + DI℄ + disp16

010 [BP + SI℄ [BP + SI℄ + disp8 [BP + SI℄ + disp16

011 [BP + DI℄ [BP + DI℄ + disp8 [BP + DI℄ + disp16

100 [SI℄ [SI℄ + disp8 [SI℄ + disp16

101 [DI℄ [DI℄ + disp8 [DI℄ + disp16

110 disp16 [BP℄ + disp8 [BP℄ + disp16

111 [BX℄ [BX℄ + disp8 [BX℄ + disp16

dispspéiantundéplaement,sur8bits(disp8)ousur16bits(disp16),edéplaementsuivant

l'otetmod r/metdevantêtreajoutéàl'index.

Le registre desegmentpar défaut est SS si l'adresse eetiveontient BPpour index et DS

(14)

L'otetmodr/mpourl'adressagesur32bits.-La signiationdel'otetmod r/mpourl'adres-

sagesur 32bits est:

r/m Adresseeetive

mod = 00 mod = 01 mod = 10

000 [EAX℄ disp8[EAX℄ disp32[EAX℄

001 [ECX℄ disp8[ECX℄ disp32[ECX℄

010 [EDX℄ disp8[EDX℄ disp32[EDX℄

011 [EBX℄ disp8[EBX℄ disp32[EBX℄

100 [℄[℄ disp8[℄[℄ disp32[℄[℄

101 disp32 disp8[EBP℄ disp32[EBP℄

110 [ESI℄ disp8[ESI℄ disp32[ESI℄

111 [EDI℄ disp8[EDI℄ disp32[EDI℄

oùdispspéie undéplaement,sur8bits(disp8)ousur32bits(disp32).

Ledéplaementdisp8 suitl'otetSIB,doitêtreétenduensigneet ajoutéàl'index.

Leode[℄[℄indiquequ'unotetSIBsuitl'otetmod r/m.

(15)

7.4 Quelques programmes en langage mahine

7.4.1 Utilisation du préxe de taille d'opérande

Voyonsommentutiliserunregistredeapaité32bits,disonsEAX,enmoderéel.Ilfaut,pour

ela, utiliserle préxedetaille d'opérande.Vérions,parexemple, quel'on peuteetuer une

additionsur 32bits en uneseuleinstrution (alorsqu'ilenfaut deux pourun miroproesseur

16bits).

7.4.1.1 Le ontexte

Érivons un programme eetuant la somme de deux entiers. Plaçons-nous sous (un vrai)

MS-DOS(surléUSB, voirappendieI)etutilisonsl'utilitairedebug.

Créonsunrépertoiredenom `REAL'surnotrelé USB.

Rappelonsquenouspouvonsutiliserlamémoirevivesituéeaprèsl'adresse3000:400pournos

expérienes,puisqu'elleestlaisséeàdispositiondel'utilisateurparlesystèmed'exploitationMS-

DOS.Plaçons0x6060001àl'emplaement3000:400et0x60B0002àl'emplaement3000:4004,

en nous souvenant qu'Intel utilise laonvention petit-boutienne, 'est-à-dire que,pour obtenir

l'entier0x01020304,ilfautérireenmémoirelesotetsdansl'ordre04 03 02 01:

C:\REAL>debug

-E 3000:400 01 00 06 06

-E 3000:404 02 00 0B 00

-D 3000:400 L 10

3000:0400 01 00 06 06 02 00 0B 06-00 00 00 00 00 00 00 00 ...

-q

Érivons maintenant un programme qui additionne le ontenu de l'emplaement mémoire

(16)

7.4.1.2 Casd'un programme utilisantdes registres16 bits

Ne nous fatiguons pas àtraduire àla main le programme utilisant des registres16 bits. Il

sut d'utiliserdebugpourletraduireenlangagesymboliqued'Intel:

C:\REAL>debug

-a

16D3:0100 mov ax,3000

16D3:0103 mov ds,ax

16D3:0105 mov ax,[400℄

16D3:0108 add ax,[404℄

16D3:010C mov [408℄,ax

16D3:010F ret

16D3:0110

-R BX

BX 0000

:

-R CX

CX 0000

:010

-N ADD.COM

-W

Eriture de 00010 otets

-Q

Lançonsleprogramme obtenuetvérionslerésultat:

C:\REAL>add.om

C:\REAL>debug

-D 3000:400 L 10

3000:0400 01 00 06 06 02 00 0B 06-03 00 00 00 00 00 00 00 ...

-q

Conlusion.-Onabienlerésultatvoulu,'est-à-direquelasomme1+2=3aétéeetuée.Les

(17)

7.4.1.3 Unprogramme utilisantdes registres32 bits

Poureetuerlasommesur32bits,ilfauthangerpartoutleregistre16bitsAXparleregistre

32bitsEAX.

Attention! Tout e qui suit doit être eetué en mode réel sur une arhiteture IA-32 ou

x86-64.Lefairesurunearhiteture16bitsonduitàunredémarrage.

Nousnepouvonspasutiliserdiretementdebugpourleodage:

C:\REAL>debug

-a

16D3:0100 mov eax,[400℄

^

Error

16D3:0100

-Q

Utilisonsdebugpourobtenirleodemahineduprogramme`add.om':

C:\REAL>debug add.om

-u

16EB:0100 B80030 MOV AX,3000

16EB:0103 8ED8 MOV DS,AX

16EB:0105 A10004 MOV AX,[400℄

16EB:0108 03060404 ADD AX,[404℄

16EB:010C A30804 MOV [408℄,AX

16EB:010F C3 RET

[...℄

D'aprèsequenousavonsvu, leodepourleprogrammeutilisantdesregistres32bitss'ob-

tientenpréxanthaqueinstrutionfaisantréféreneàunregistre16bits(disonsAX)par0x66

pourfaireréféreneàunregistre32bits(disonsEAX):

C:\REAL>debug

-E 100 B8 00 30 8E D8 66 A1 00 04 66 03 06 04 04 66 A3 08 04 C3

-R BX

BX 0000

:

-R CX

CX 0000

:013

-N ADD32.COM

-W

Eriture de 00013 otets

-Q

Lançonsleprogrammeobtenuetvérionslerésultat:

C:\REAL>add32.om

C:\REAL>debug

-D 3000:400 L 10

3000:0400 01 00 06 06 02 00 0B 06-03 00 11 0C 00 00 00 00 ...

-q

qui montre,d'unepart, quel'on abien eetué enune seule étape uneaddition sur 32 bits, à

savoir0x6060001 + 0x60B0002 = 0xC110003, et, d'autrepart, qu'on abien lareprésentation

(18)

7.4.2 Utilisation du préxe de taille de onstante

Voyonsommentplaerunmotdoubleenmémoireenuneseuleinstrution(aulieudedeux

pourun miroproesseur16 bits). Plus exatementplaçons l'entier 0x100400à l'emplaement

3000:400.

7.4.2.1 Casd'un programme utilisantune onstante de 16 bits

Commençonsparérire unprogrammepourplaer l'entier0x400de 16bits àet emplae-

ment:

C:\REAL>debug

-a

16D3:0100 mov ax,3000

16D3:0103 mov ds,ax

16D3:0105 mov bx,400

16D3:0108 mov [400℄,bx

16D3:010C ret

16D3:010D

-R BX

BX 0000

:

-R CX

CX 0000

:0D

-N mov16.om

-W

Writing 0000D bytes

-Q

Lançonsleprogramme obtenuetvérionslerésultat:

C:\REAL>debug

-D 3000:400 L 10

3000:0400 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ...

-q

C:\REAL>mov16

C:\REAL>debug

-D 3000:400 L 10

3000:0400 00 04 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ...

-q

Laopieabienétéeetuée.Iln'yariendeplusparrapportàequenousonnaissionsdéjà,

(19)

7.4.2.2 Casd'un programme utilisantune onstantede 32 bits

Érivonsmaintenant un programme utilisant une onstante de 32 bits pourréaliser e que

nousvoulons:

mov ax,3000

mov ds,ax

mov ebx,100400

mov [400℄,ebx

ret

Nous ne pouvons pasutiliser debugpour oder e programme en langage mahine, mais il

peutnousfailiterlatâheenodantleprogrammepréédent:

C:\REAL>debug mov16.om

-u

16EB:0100 B80030 MOV AX,3000

16EB:0103 8ED8 MOV DS,AX

16EB:0105 BB0004 MOV BX,400

16EB:0108 891E0004 MOV [400℄,BX

16EB:010C C3 RET

[...℄

D'aprèsequenousavonsvu,leodepourleprogrammeutilisantdesregistresde32bitss'ob-

tientenpréxanthaqueinstrutionfaisantréféreneauregistreBXpar0x66pourfaireréférene

au registreEBX.Ce n'est pas susant,il faut aussipréxerl'instrution faisantintervenir une

onstante de 32 bits parle préxe0x67 et ne pasoublier que ette onstante oupe 4otets

mêmesil'entiertientsur3otets:

C:\REAL>debug

-E 100 B8 00 30 8E D8 66 67 BB 00 04 10 00 66 89 1E 00 04 C3

-R BX

BX 0000

:

-R CX

CX 0000

:011

-N mov32.om

-W

Writing 00011 bytes

-Q

Lançonsleprogrammeobtenuetvérionslerésultat:

C:\REAL>mov32.om

C:\REAL>debug

-D 3000:400 L 10

3000:0400 00 04 10 00 00 00 00 00-00 00 00 00 00 00 00 00 ...

-q

Lenombrevouluabienétéplaéenmémoire.

Exerie1.-Vérier que si on oubliele préxe 0x67 ousi la onstanteest donnéesur 3otets

(20)

Exerie2.-Coder,laner etvérier l'ation duprogrammesuivant:

mov ax,3000

mov ds,ax

mov ebx,400

mov byte ptr [ebx℄,7

ret

Exerie3.- Que se passe-t-il si, dans le programme préédent, on donne omme valeur à EBX

une adresse supérieureà0xFFFFF,apaité maximumdumode réel?

(21)

7.5 Utilisation d'un assembleur

Nous venons de donner quelques exemples de programmes en ode mahine, e qui est la

meilleure façon de omprendre omment ela marhe. Nous allons maintenant voir omment

programmerenlangaged'assemblage.

Pour la suite, nous ontinuerons à utiliser le système d'exploitation MS-DOS sur une lé

USB. Le résultatde l'assemblage étant indépendantdusystème d'exploitation surlequel il est

utilisé, nous utiliseronsgas sousLinux, en s'arrangeantpour obtenirun exéutablebrut, puis

noustesteronsl'exéutablesurMS-DOS(puisqu'ilnepeutpasêtreexéuté,rappelons-le,même

aveleformatd'exéutableadéquat,enmodeprotégéniveau3,queesoitsousWindowsousur

Linux).

7.5.1 Les utilitaires GNU pour le mode réel

Les utilitaires GNU, onçu pour des miroproesseurs32 bits, ne sont pasbien adaptésau

moderéel.Montronsependantqu'onpeut,aveunpeudeontorsion,lesutiliserpouremode.

Exemple.- Rappelons e que nous avons fait ave nos programmes en langage mahine : nous

avonsherhé

hh

àlamain

ii

desemplaementsmémoirenon utiliséspouryplaerlesdonnées.

Onpeutévidemmentfairedemêmeaveunassembleur,leprogrammeenlangaged'assemblage

étantalorslemêmequeeluienlangagesymboliqueIntel.

Érivonsdon un programme en langage d'assemblage gas allant herher un entier de 16

bits à l'emplaement mémoire d'adresse 6000:0,y ajoutantelui de l'emplaement6000:4 et

déposantlerésultatàl'emplaement6000:8:

.setion .text

.globl _start

.ode16

_start:

movw $0x6000,%ax

movw %ax,%ds

movw 0x0,%ax

addw 0x4,%ax

movw %ax,0x8

ret

Remarque.- Puisque nous voulons que notre premier programme soit un programme en mode

réel,onutiliseladiretive.ode16,spéiantquelesinstrutionsetonstantesontunetaillede

16bitspardéfaut.

Assemblage.-Nousavonsdéjàvuommentassemblerunprogrammeutilisateuravegasetld.

Danslamesureoùonveutunexéutablebinairebrut,ilfautmaintenantune étapedeplus.

Onpeutérireleprogrammeaven'importequeléditeurdetexte,enlenommantparexemple

asm1.s.Onommeneensuiteparl'assemblerommedansleasd'unprogrammeutilisateur:

$ as asm1.s -o asm1.o

$ ld ./asm1.o -o ./asm1

$

Remarquonsque si onessaie dele désassemblerave objump,ommedans le as d'un pro-

(22)

$ objdump -d ./asm1

./asm1: file format elf64-x86-64

Disassembly of setion .text:

0000000000400078 <_start>:

400078: b8 00 60 8e d8 mov $0xd88e6000,%eax

40007d: a1 00 00 03 06 04 00 movabs 0x8a3000406030000,%eax

400084: a3 08

400086: 00 3 add %al,%bl

$

Cei s'explique par lefait que objdump analysepar défaut duode d'instrutions 64 ou32

bitsetnon16bits.Onremarquerad'ailleursquelesadressesvirtuellessontdonnéessur64bits,

enommençantparl'adresse0x0000000004000078,etnonsur20bits.

Ilfaut don ajouterl'option -m(pour Miroproessor) àobjdumppourlui indiquerqu'on a

duode16bits,avel'argumentadéquat,iii8086:

$ objdump -d -mi8086 ./asm1

./asm1: file format elf64-x86-64

Disassembly of setion .text:

0000000000400078 <_start>:

400078: b8 00 60 mov $0x6000,%ax

40007b: 8e d8 mov %ax,%ds

40007d: a1 00 00 mov 0x0,%ax

400080: 03 06 04 00 add 0x4,%ax

400084: a3 08 00 mov %ax,0x8

400087: 3 ret

$

Leodeestdésormaisorretementinterprétémaisremarquonsquelesadressessonttoujours

donnéessur64bits.

Lataille duhier exéutable(672 otets)etsonformatspéiéparobjdump montre qu'on

n'estpasenprésened'unbinairebrut. Onutilise l'utilitaireobjopypourobtenirelui-i:

$ objopy -O binary ./asm1 ./asm1.om

$

(23)

ExéutionsousMS-DOS.-Exéutonslehierasm1.om,aprèsavoirfaitlespréparationsnées-

saires:

C:\REAL>debug

-E 6000:0 06

-E 6000:4 09

-D 6000:0 L 10

6000:0000 06 00 00 00 09 00 00 00-00 00 00 00 00 00 00 00 ...

-q

C:\REAL>asm1.om

C:\REAL>debug

-D 6000:0 L 10

6000:0000 06 00 00 00 09 00 00 00-0F 00 00 00 00 00 00 00 ...

quimontrequel'additionabienétéeetuée.

(24)

7.5.2 Utilisation de maros

Nousavonsvu, àproposdelaprogrammationutilisateur,ommentutiliserdesmarosdans

unlangaged'assemblage.A FAIREDANSLAPREMIERE PARTIEIln'y aauuneraison,on

peutaussiutiliserdesmarospourlaprogrammationsystème.

Exemple.-Réérivonsleprogrammepréédentpourobtenirunprogrammedanslequellesdeux

donnéesàadditionnersontplaéessousformedeonstantes,situées aprèsleode,an debien

distinguerlapartieodedelapartiedonnées.Parontre,onplaetoujourslerésultatàl'empla-

ementexpliite6000:0,pourpouvoirvérierquel'additionabienétéexéutée.Nousobtenons

leprogrammeasm2.s:

.setion .text

.globl _start

.ode16

_start:

movw $0x6000,%ax

movw %ax,%ds

movw $a,%ax

addw $b,%ax

movw %ax,0x8

ret

a = 10

b = 22

Assemblonsleprogramme,lions-leetdésassemblons-le:

$ as asm2.s -o asm2.o

$ ld asm2.o -o asm2

$ objdump -d -mi8086 ./asm2

./asm2: file format elf64-x86-64

Disassembly of setion .text:

0000000000400078 <_start>:

400078: b8 00 60 mov $0x6000,%ax

40007b: 8e d8 mov %ax,%ds

40007d: b8 0a 00 mov $0xa,%ax

400080: 05 16 00 add $0x16,%ax

400083: a3 08 00 mov %ax,0x8

400086: 3 ret

$ objopy -O binary ./asm2 ./asm2.om

$

Ons'aperçoitquelesvaleursintroduitesparlesmarosontétéplaéesimmédiatementdansles

instrutionsadéquates:lastrutureduprogrammesoureneseretrouvepasdansleprogramme

(25)

ExéutionsousMS-DOS.-Exéutonslebinaireobtenuasm2.omsousMS-DOS:

C:\REAL>asm2.om

C:\REAL>debug

-D 6000:0 L 10

6000:0000 00 00 00 00 00 00 00 00-20 00 00 00 00 00 00 00 ... ...

quimontrequel'additionabienétéeetuée,puisque32 = 0x20,odeASCIIdel'espae,omme

onpeutlevérierdanslatroisième olonne.

Commentaire.-Nousavonsvuunenouvellediretive,ladélarationd'unemaro, delaforme:

identifiateur = valeur

qui peut être plaée n'importe où, sur une ligne à part, dans le hier soure. L'assembleur

remplaetouteourrenedel'identiateurparlavaleur.

(26)

7.5.3 Étiquetage des données modiables

Introdution.-L'érituresurdesemplaementsmémoirehoisisparl'utilisateurpeutêtredange-

reuselorsqu'unsystèmed'exploitationlaneunexéutable,puisque'estlesystèmed'exploitation

quidéidel'emplaementdetelleoutelledonnée:onrisquedesurhargerunedonnéeessentielle.

En eet,lorsqu'unsystème d'exploitationhargeunprogramme,il herheunemplaement

mémoirelibreompatible avelataille deeprogramme.Ilvautdonmieuxnepasfaireappel

àdesemplaementsexpliites demémoirepourêtresûrdeneriendétruire.

Pour éviter e problème, la plupart des systèmes d'exploitation exigent que le ode d'un

programme et sesdonnées soient dans dessetions distintes.Il ne permet quela leture (et

interditl'ériture)dansunesetiondeode,equiempêheleprogrammedemodiersonpropre

ode.

CeiestfaileàmettreenplaeavelemodeprotégédesmiroproesseursIntelommenous

leverrons: lasetion deodeest plaéedansunsegmentdans lequelonnepeutquelirealors

quelasetiondesdonnéesestplaéedansunsegmentdanslequelonpeutlireetèrire.

Cei n'est pas le as pour le mode réel : on peut lire et érire sur tous les segments. De

plus,leproblèmedemeure,mêmeenmodeprotégé,lorsque'estl'utilisateur,et nonlesystème

d'exploitation,qui déideoùplaerlesdonnées(danslasetiondesdonnées).

Nousvenonsdevoirommentutiliserdesonstantespourbiendégagerlesdonnéesduode

proprementdit. Cei ne marhe évidemment que pourles

hh

données

ii

àlire, et non pourles

donnéesdetravail,qu'onveutpouvoirlireetérire.Uneautrefaçondefaireréserverdesempla-

ementsmémoireparlesystèmesd'exploitationestd'étiqueter desemplaementsmémoire.

Exemple.-Réérivonsleprogrammepréédentdefaçonàe quelesdeuxdonnéesàadditionner

soientétiquetées.Parontre,onplaetoujourslerésultatàl'emplaementexpliite6000:0,pour

pouvoirvérierquel'additionabienétéexéutée:

.globl _start

.arh i8086

.ode16

_start:

movw a,%ax

addw b,%ax

movw $0x6000,%dx

movw %dx,%ds

movw %ax,0x8

ret

a: .word 10

b: .word 22

Remarques.-1

o

)Lepointessentielestl'étiquetage,paraetb,dedeuxzonesdemémoire,toutes

lesdeuxd'unetaillededeuxotets.Ellessontsituéesaprèsleode.Eneet,lemiroproesseurne

saitpasdiérenierleodedesdonnées;silepointeurd'instrutionpointesurunemplaement

mémoire étiqueté, il essaie de l'interpréter omme une instrution, et don de l'exéuter, e

qui risquede donnerlieu àunredémarragedusystème puisqu'il n'yaauune raisonque ette

hh ii

(27)

-2

o

)En gas,unemplaementmémoireétiquetéest délarédelafaçonsuivante:

identifiateur: type valeurInitiale

où:

identifiateurest unmotsurl'alphabet formédelettres,minusulesetmajusules,et

dehiresetdequelquesaratèresspéiaux,neommençantpasparunhireetn'étant

pasun mot réservé. Cettedénition, relativement impréise, devrait être susante.On

trouveévidemmentunedénition formelledanslemanueldegas.

Lesignedeuxpoints`:'indiquequ'ils'agitdeladélarationd'unemplaementmémoire,

etnondesonutilisation.

Letypespéielatailledesvaleursdelavariable:

.bytepourunotet;

.wordpourunmotdedeuxotets;

.longpourun motdouble, soit quatre otets (maise type et les typessuivantsne

s'utilisentpasenmoderéel);

Lavaleurinitiale est unentier, expriméen déimalou enhéxadéimal, ompatible ave

lataille annonée.

- 3

o

) En programmationutilisateuren mode protégé,une telle délarationne peut

êtreeetuéequedansunesetion.datamais,ommenousl'avonsdéjàdit,ladistintionentre

odeet donnéesapeudesensenmoderéel.

- 4

o

) Une étiquette plaée dans une instrution, dans un programme en langage

d'assemblage,est traduite,enodemahine, parledéalagede l'emplaementmémoireorres-

pondant lors de l'assemblage. L'étiquette préédée du signe `$' est traduite par le ontenu de

l'emplaementmémoire.

- 5

o

) Puisque nous voulons obtenirdu mode réel,nous devonsutiliser ii, outre la

diretive .ode16 déjà renontrée, la diretive .arh ave la valeur i8086. En eet .ode16

spéiequ'onveutunmoded'instrution16bits.Celuiexistepourlemoderéel,maiségalement

pourlemodeprotégé.Ladiéreneestquelesdéalagessontsur16bitsenmoderéeletsur32

bitsenmodeprotégé.Ladiretive.arh i8086spéied'utiliser desdéalagessur16bits.

Assemblagesansliage.- On peut assembler le hier soure omme d'habitude mais, si nous

sommessur unGBU/Linux 64bits,il faut utiliserl'option32pourobtenirunhierELF 32

bits(etnon64bits):

$ as asm3.s --32 -o asm3.o

$

Ceiestdûaufaitqu'onnepeutpasutiliserlemoded'instrutions16bitsdanslemode64bits

alorsquel'assemblageonduitpardéfautàunhierELF64bitssurunsystème64bits.

Remarquonsquesionessaiedelierlehierobjetobtenu, onobtientuneerreur:

$ ld asm3.o -o asm3

ld: i386 arhiteture of input file `asm3.o' is inompatible with i386:x86-64 output

asm3.o: In funtion `_start':

(.text+0x1): reloation trunated to fit: R_386_16 against `.text'

asm3.o: In funtion `_start':

(.text+0x5): reloation trunated to fit: R_386_16 against `.text'

$

arlelieurlddeGNUn'estpasadaptéàl'arhiteture16bits,ontrairementàd'autresassem-

(28)

Cependanttoutn'estpasperdu.Sionregardelapartieodedeehierobjet,ons'aperçoit

qu'onabienleodemahine voulu:

$ objdump -d -mi8086 ./asm3.o

./asm3.o: file format elf32-i386

Disassembly of setion .text:

00000000 <_start>:

0: a1 10 00 mov 0x10,%ax

3: 03 06 12 00 add 0x12,%ax

7: ba 00 60 mov $0x6000,%dx

a: 8e da mov %dx,%ds

: a3 08 00 mov %ax,0x8

f: 3 ret

00000010 <a>:

10: 0a 00 or (%bx,%si),%al

00000012 <b>:

12: 16 push %ss

...

$

Remarquonsquelesadressesvirtuellessontmaintenantdonnéessur 32bits et nonplussur

64bits,grâeàl'optiopn32(maisellesnesonttoujourspasdonnéessur20bits).

Remarquonségalementque,siobjdump,ommetoutdésassembleur,ettefois-i,désassemble

orretementlapartie quenousonsidéronsommeduode,il perdpied lorsqu'ilrenontredu

odebinaireneorrespondantpasàdesinstrutionsmaisàdesdonnées.

Transformonsdonehierobjet, nonlié,pourobtenirdubinairebrut:

$ objopy -O binary ./asm3.o ./asm3.om

$

Onpeutvoiraveunéditeurhexadéimalqu'onobtientbienlebinairedésiré:

$ ghex asm3.om &

(29)

AdaptationpourMS-DOS.-Lorsdesonhargementparlesystèmed'exploitation,unexéutable

.omest préédéd'un préxede256otets. Ledéalagedonton aalorsbesoin(parrapport à

la valeur de CS hoisie par le système d'exploitation) pour le premier emplaement mémoire

étiqueté,parexemple,est nonpas0x10mais0x110.

Onl'indique enutilisantladiretive.orgpermettantdepréiserledéalage delalignequi

suit.Onutiliseradonleprogrammeasm3.ssuivant:

.globl _start

.arh i8086

.ode16

.org 0x100

_start:

movw a,%ax

addw b,%ax

movw $0x6000,%dx

movw %dx,%ds

movw %ax,0x8

ret

a: .word 10

b: .word 22

ExéutionsousMS-DOS.-L'exéution dubinaireobtenu, asm3.om:

C:\REAL>asm3

C:\REAL>debug

-D 6000:0 L 10

6000:0000 00 00 00 00 00 00 00 00-20 00 00 00 00 00 00 00 ... ...

(30)

7.5.4 Utilisation des registres 32 bits

Onpeututiliser,enmoderéel,unregistre32bitssansproblèmeainsiquedesonstantes et

desadressessur32bits. Lespréxesadéquatssontplaéslorsdel'assemblage.

Exemple.-Érivonsunprogrammeasm4.sutilisantleregistreEAX:

.setion .text

.globl _start

.ode16

.org 0x100

_start:

movl a,%eax

addl b,%eax

movw $0x6000,%dx

movw %dx,%ds

movl %eax,0x0

ret

a: .long 0x100000

b: .long 0x22

en remarquant que les emplaements mémoireétiquetés doivent maintenant être du typemot

double.

Remarquonsqueladiretive.arh i8086adisparu.Elleonduiraitàuneerreurpuisqueles

registres32bitsn'ontpasdesenspourunetellearhiteture.

Assemblagesansliage.-Onassemblelehiersoureommedansleaspréédent:

$ as asm4.s --32 -o asm4.o

$

Commedansl'exemplepréédent,sionregardelaolonneodedeehierobjet,ons'aper-

çoitqu'onabienleodemahinevoulu :

$ objdump -d -mi8086 ./asm4.o

./asm4.o: file format elf32-i386

Disassembly of setion .text:

00000000 <_start-0x100>:

...

00000100 <_start>:

100: 66 a1 13 01 mov 0x113,%eax

104: 66 03 06 17 01 add 0x117,%eax

109: ba 00 60 mov $0x6000,%dx

10: 8e da mov %dx,%ds

10e: 66 a3 00 00 mov %eax,0x0

112: 3 ret

00000113 <a>:

(31)

115: 10 00 ad %al,(%bx,%si)

00000117 <b>:

117: 22 00 and (%bx,%si),%al

...

$

ave lepréxe 0x66pour lesinstrutions 32 bits. Mais leode ommençantàl'adresse 0x0 et

non0x100,il ya256otetsnuls.

Commençonspartransformer,ommedansl'exemplepréédent,ehierobjet,nonlié,an

d'obtenirdubinairebrut :

$ objopy -O binary ./asm4.o ./asm4.om

$ ls -l ./asm4.om

-rwxr-xr-x 1 patrik patrik 283 sept. 4 10:33 ./asm4.om

$

Ilomporte283otetsdontonneveutonserverqueles27(=283-256)derniers.Onutilise

poureladenouvellesoptionsdeobjopy:

$ objopy -O binary -i 512 --interleave-width 27 -b 256 ./asm4.o ./asm4.om

$

où -i pour Interleave signie qu'on ne doit onserver que le nombre d'otets préisé par la

largeur spéiée (interleave-width)à partir de l'otet préisé par -b (pour Byte), le tout

dansl'intervalled'amplitudesp¢iéeparl'argumentde-i.

Onpeutalorsvoiraveunéditeurhexadéimalqu'onobtientbienlebinairedésiré:

$ ghex asm4.om &

$

ExéutionsousMS-DOS.-L'exéution dubinaireobtenu, asm4.om:

C:\REAL>fasm3

C:\REAL>debug

-D 6000:0 L 10

6000:0000 22 00 10 00 00 00 00 00-00 00 00 00 00 00 00 00 "...

montrequel'additionestbien eetuéesur32bits.

7.6 Bibliographie

[Lil-89℄ Lilen,Henri,80386:modesdefontionnementarhitetureprogram-

(32)

7.7 Appendie I : MS-DOS sur une lé USB

Commenousl'avonsdit,nousallonsétudierlesinstrutionsdumoderéelenutilisantunPC

munidusystèmed'exploitationMS-DOS. Sivousdisposezdéjàd'unsystèmeinformatiqueave

MS-DOS(enmoderéel,'est-à-direjusqu'àlaversion6.22),quee soitunordinateurauxiliaire

ouunavemultiple démarrage,ilest inutiled'installerMS-DOS. Mais'estraredenosjours.

Sivousdisposezd'unordinateuraveunleteurdedisquettes,vouspouvezpartitionnervotre

disqueduretinstallerMS-DOSsurlapremièrepartition.Mais'estégalementraredenosjours.

Celapeutégalementsefaire,enjonglantunpeu,sil'ordinateurdisposed'unleteurdeCD-ROM.

LeasleplusfréquentestunordinateurPCayantunmiroproesseurIntelpuissant,leplus

souvent64bits, et,pourequinousintéresse,desportsUSB.

NousallonsdoninstallerMS-DOSsuruneléUSB.OnhoisirasoitMS-DOS5.0disponible

gratuitement,soitMS-DOS6.22,qui restesousliene Mirosoftmaisdisponible gratuitement,

ommetouslesautresoutilsdedéveloppementMirosoft,pourlesétudiantsdansundépartement

d'informatiqueabonnéausystèmeMSDN (oupard'autresmoyens,illiitesependant).

7.7.1 Première étape : réupérer MS-DOS

Ilfautréupérerlehieren_msdos622.exesurMSDN (oudefaçonilliite).Leplaerdans

un répertoire vide, par exemple de nom `en_MSDOS622', et faitesexéuter (sous Windows) e

hierauto-extratible.Onobtientdeuxsous-répertoires:`DISKS'et`UPGRADE'.

Ces répertoiresontiennentà lafois des hiers aunom bizarreet deshiers exéutables.

Cesontes derniersqui nousintéressent.

7.7.2 Seonde étape : réer une lé USB bootable

UnelébootableestuneléUSBqui,lorsqu'ondémarrel'ordinateuravelalédansundes

onneteursUSB(etenspéiantauBIOSdeommenerparherherunsystèmed'exploitation

sur une telle lé, avant d'allerherhersur undisque dur ouun CD-ROM), hargele système

d'exploitationquisetrouvesurelle-i.

Réupérationd'unutilitaire.- Nous verrons plus tard omment réer une lé bootable. Utili-

sonspourlemomentunutilitairepourlefaire.Spéier`HP Drive Key Boot Utility v2.1.8

download'survotremoteurdereherhefavori.CeinerenvoieplusausiteorigineldeHewlett-

Pakardarl'utilitaireaévolué(maislanouvelleversionneonvientpasàequenousvoulons

faire).Onpeutleréupérer,parexemple(aumomentoùnousérivons)surlesite Web:

http://files.extremeoverloking.om/file.php?f=197

en liquant sur `Primary Download Site', qui permet de téléharger le hier `SP27608.exe'

de 1,97 MiO. Plaez-le dans un répertoirevide de votre système d'exploitation Windows, par

exemple`HP DriveKey'etfaites-leexéuter.Onseretrouveavequatrehiers,dontl'exéutable

HPUSBFW.exe(pourHP USBDisk Storage Format Tool FreeWare).

FihiersMS-DOSessentiels.- Préparez un autre répertoire vide sur votre système d'exploita-

tion Windows, nommé par exemple `MSDOS622' et plaez-y les trois hiers `ommand.om',

`io.sys' et `msdos.sys' trouvés dans le sous-répertoire `UPGRADE' de `en_MSDOS622'. Atten-

tion! es hiers sont

hh

ahés

ii

ar onsidérés omme hiers système : il faut aller dans les onglets `Panneau de onfiguration', `Apparene et personnalisation' puis `Affiher

les fihiers et dossiers ahés'pour déséletionner,aumoins defaçontemporaire,l'op-

tion `Masquer les fihiers protégés du système d'exploitation (reommandé)' an de

(33)

Figure7.1FenêtredeHP USB Disk Storage Format Tool

PlaementdeMS-DOSsurlaléUSB.-Insérezunelé USB(demoinsde2GiO)dansunon-

neteur USB et faitesexéuterl'utilitaire HPUSBFW.exeen tantqu'administrateur. On obtient

lafenêtre de lagure7.1. Vériezquele volume indiquédans `Devie'estbien elui dela lé

que vous voulez rendre bootable. Choisissez le système de hiers FAT16, 'est-à-dire `FAT'.

Choisissez éventuellement un nom de volume autre que elui indiqué par défaut. Cliquez sur

`Create aDOS startupdisk'puissur`using DOSsystemles loatedat:'.Appuyezsurlestrois

petits points pour reherher le dossier `MSDOS622' préédemment préparé puis sur le bouton

`Start'.Lafenêtre delagure7.2s'ouvre.

Figure7.2Fenêtred'avertissementdeHP USB Disk Storage Format Tool

Après avoir vérié une dernière fois qu'il s'agit bien de la lé USB voulue, appuyez sur le

(34)

DémarragedeMS-DOS.- Une fois l'opération terminée, redémarrez l'ordinateur en laissant la

lé USBdans leonneteur.Ilfaut indiquerauBIOSde bootersur une lé USBen hangeant

l'ordreduhoixdepériphériquedeboot.Si tout s'estbien passé,on seretrouveaveMS-DOS

(avelavierQwertypourl'instant).Plusexatementonvoit apparaître:

Starting MS-DOS...

Current date is Wed 01-09-2013

Enter new date (mm-dd-yy):

Appuyersurletouhe`retour'.Onaalors:

Starting MS-DOS...

Current date is Wed 01-09-2013

Enter new date (mm-dd-yy):

Current time is 11:01:58.32a

Enter new time:

Appuyersurletouhe`retour'.Onseretrouveave:

Starting MS-DOS...

Current date is Wed 01-09-2013

Enter new date (mm-dd-yy):

Current time is 11:01:58.32a

Enter new time:

Mirosoft(R) MS-DOS(R) Version 6.22

(C)Copyright Mirosoft Corp 1981-1994

C:\>

On seretrouveave lamêmeinvite de ommandequeelle trouvée surl'émulateurd'invite

deommande`ommand.om'deWindows.

On peut ommener à explorer MS-DOS mais on se trouve dans la version anglaise ave

lavierquerty.

7.7.3 Troisième étape : version française omplète

Pourlasuiteonvaseplaerdanslaversionavelavierazertyetajouterlesutilitaires dont

nousavonsbesoin,enpartiulier `debug'.

UtilitairesMS-DOS.-EnlevezlaléUSBetredémarrezl'ordinateurpourseretrouveraveWin-

dows. Plaez, seulement une fois le système démarré, la lé dans un onneteur USB. Créez

un répertoire `DOS' sur la lé et plaez-y les hiers `COUNTRY.SYS',`DEBUG.EXE', `EDIT.COM',

`KEYB.COM', `KEYBOARD.SYS', `MORE.COM' et `QBASIC.EXE' se trouvant dans le sous-répertoire

`UPGRADE'de`en_MSDOS622'.

Fihiersdeonguration.-Préparerunhierdenom`AUTOEXEC.BAT'(avenotepadparexemple

(35)

ECHO OFF

PROMPT $p$g

PATH C:\DOS

KEYB FR,,C:\DOS\KEYBOARD.SYS

Prépareraussiunhierdenom`CONFIG.SYS'àplaerégalementàlarainedelaléUSB:

COUNTRY=033,850,C:\DOS\COUNTRY .SYS

NotreversionnaledeMS-DOS.-Redémarrezl'ordinateurenlaissantlaléUSBdansleonne-

teur.Onvoit maintenantapparaître:

Starting MS-DOS...

C:\>

OnpeutmaintenantutiliserMS-DOS avelavierazerty.

(36)

7.8 Appendie II

7.8.1 Types de données

Intelutiliselestypesdedonnéessuivants:

lebit est,lassiquement,eluidelapluspetitequantitéd'information;

l'otet(byte) estungroupede8bitsreprésentantunentierrelatifomprisentre -128et

127;

l'otetnonsignéestungroupede8bitsreprésentantunentiernaturelomprisentre0et

255;

lemot(word) estungroupede16bits,soitdeux otets;

lemot entierestunmotreprésentantunentierrelatif;

lemot double(doubleword) estungroupede32bits,soitquatreotetsoudeuxmots;

unentier longestunmotdoublereprésentantunentierrelatifenomplémentàdeux;

unentier long nonsignéestunmotdoublereprésentantunentiernaturel;

unhamp de bitsestunehaînede32bitsaumaximum;

unaratère estunotetontenantunodeASCII;

unehaîne de bitsestunesuitedebitsd'auplus4GiO;

unehaîneestune suited'otetsd'unelongueurompriseentre1et 4GiO;

unDCB ompatéest unhiredéimalodébinaireave4bitsparhire;

unDCB étenduestunhiredéimalodébinaireave8bitsparhire;

unpointeur ourtest undéalagede16ou32bits dansunsegment;

un pointeur long est formé d'un séleteur (adresse de segment) sur 16 bits et d'un

pointeurourt;

unevirgule ottante(pointottant) estlareprésentationd'un nombreréel signé,sur32,

(37)

7.8.2 Noms des instrutions en langage d'assemblage

Donnonslalistedesinstrutionsaveunelassiationplusnequeelledonnéei-dessus.

Instrutions de transfert de données

Ilyaseptinstrutionsdetransfertdedonnéesenlangagesymbolique:

Instrution Fontion

MOV Déplaementd'unopérande

PUSH Chargementd'unopérandesurlapile

POP Extrationd'unopérandedelapile

PUSHA Chargementdetouslesregistresdanslapile

POPA Extrationdetouslesregistresdelapile

XCHG Éhanged'opérandes

XLAT Tradution

dontinqexistaientdéjàpourle8086.

Instrutions d'entrée-sortie

Ilyalesdeuxmêmesinstrutionsd'entrée-sortieenlangagesymboliquequepourle8086(et

mêmele8080):

Instrution Fontion

IN Entréed'unopérande

OUT Sortied'unopérande

Instrutions arithmétiques

Onretrouvelesdix-septinstrutionsarithmétiques enlangagesymboliquedu8086:

Instrution Fontion

INC Inrémenterde1

DEC Dérémenterde1

ADD Addition

ADC Additionaveretenue

SUB Soustration

SBB Soustrationaveemprunt

MUL Multipliationensimpleoudoublepréision

DIV Divisiond'entiersnaturels

NEG Inversionlogiqueenomplémentà2

IMUL Multipliationd'entiersrelatifs

IDIV Divisiond'entiersrelatifs

CMP Comparaison

DAA Corretiondéimaleaprèsaddition

AAA AjustementASCIIaprèsaddition

AAS AjustementASCIIaprèssoustration

AAM AjustementASCIIaprèsmultipliation

(38)

Instrutions onditionnellesde ontrle du programme

On retrouveles dix-huit instrutions onditionnelles de ontrle du programme dulangage

symboliquedu8086ainsiquelanouvelleinstrutionSETCC:

Instrution Fontion

JA/JNBE Sautsisupérieur/sinoninférieurniégal

JAE/JNB Sautsisupérieurouégal/sinoninférieur

JB/JNAE Sautsiinférieur/sipassupérieurniégal

JBE/JNA Sautsiinférieurouégal/sipassupérieur

JC Sautsiretenue

JE/JZ Sautsiégal/sinul

JG/JNLE Sautsiplusgrand/sipaspluspetitouégal

JGE/JNL Sautsiplusgrandouégal/sipaspluspetit

JL/JNGE Sautsipluspetit/sipasplusgrandniégal

JLE/JNG Sautsipluspetitouégal/sipasplusgrand

JNC Sautsipasderetenue

JNE/JNZ Sautsinonégal/sinonnul

JNO Sautsipasdedépassementdevapaité

JNP/JPO Sautsipasdeparité(impaire)/siparitéimpaire

JNS Sautsipasdesigne

JO Sautsidépassementdeapaité

JP/JPE Sautsiparité(paire)/siparitépaire

JS Sautsisigne

SETCC Rangementonditionneld'otet

Autres instrutionsde ontrledu programme

On retrouvelesdouze autres instrutionsdeontrledu dulangagesymboliquedu8086et

lanouvelleinstrutionJECX:

Instrution Fontion

CALL Appeld'unsous-programme

RET Retourd'unsous-programme

JMP Sautinonditionnel

LOOP Boule

LOOPE/LOOPZ Boule siégal/sinul

LOOPNE/LOOPNZ Boule sinonégal/sinonnul

JCXZ Sautsileregistre CXestnul

INT Interruption

INTO Interruptionsidépassementdeapaité

IRET Retourd'uneinterruption

CLI Inhibitiondesinterruptionsmasquables

STI Autorisationdesinterruptionsmasquables

(39)

Instrutionslogiques

Onretrouvelesinqinstrutionslogiquesdulangagesymboliquedu8086:

Instrution Fontion

NOT Inversionlogique bitàbit

AND ETlogiquebitàbit

OR OUlogiqueinlusifbitàbit

XOR OUlogiqueexlusifbitàbit

TEST Test

Instrutions de déalage etde rotation

Onretrouveleshuitinstrutionsdedéalageet derotationdulangagesymboliquedu8086

ainsiquelesdeux nouvellesinstrutionsSHLDet SHRD:

Instrution Fontion

SHL/SHR Déalagelogiqueàgauhe/àdroite

SAL/SAR Déalagearithmétiqueàgauhe/àdroite

ROL/ROR Rotationàgauhe/àdroite

RCL/RCR Rotationvialaretenueàgauhe/àdroite

SHLD/SHRD Doubledéalageàgauhe/àdroite

Instrutions de manipulation de bits

Ilyahuitinstrutionsdemanipulationdebits,toutesnouvelles:

Instrution Fontion

BT Testdebit

BTS Testdebitetpositionnementà1

BTR Testdebitetréinitialisation (à0)

BTC Testdebitetomplémentation

BSF Balayagediretdebits

BSR Balayageinversedebits

IBTS Insertiondansunehaînedebits

XBTS Extrationdansunehaînedebits

Instrutions sur les haînesde aratères

Onretrouvelesdixinstrutionssurleshaînesdearatèresdulangagesymboliquedu8086:

Instrution Fontion

MOVS Copied'unehaîned'otets,demotsoudemotsdoubles

INS Saisied'unehaînedearatères

OUTS Sortied'unehaînedearatères

CMPS Comparaisondehaînesdearatères

SCAS Analysed'unehaînedearatères

LODS Chargementd'unehaînedearatères

STOS Rangementunehaînedearatères

REP Répétitiond'uneopérationsurleshaînesdearatères

REPE/REPZ Répétitiontantqueégal/nul

(40)

Instrutions de onversion

Au vu de toutes les tailles de données élémentaires àmanipuler, il y a six instrutions de

onversionenlangagesymbolique:

Instrution Fontion

MOVZX Copied'unotet,d'unmot,d'undoublemot,sansextensiondusigne

MOVSX Copied'unotet,d'unmot,d'undoublemot,aveextensiondusigne

CBW Conversiond'unotetenunmotoud'unmotenunmotdouble

CDW Conversiond'unmotenunmotdouble

CDWE Conversionétendued'unmotenunmotdouble

CDQ Conversiond'unmotdoubleenunmotquadruple

dontseulesCBW(etCDW)existaientpourle8086.

Instrutions de formation des adresses

Ilyasixinstrutionsdeformationdesadressesenlangagesymbolique,toutesnouvelles:

Instrution Fontion

LEA Chargerl'adresseeetive

LDS Chargerlepointeurdansleregistre desegmentDS

LES Chargerlepointeurdansleregistre desegmentES

LFS Chargerlepointeurdansleregistre desegmentFS

LGS Chargerlepointeurdansleregistre desegmentGS

LSS Chargerlepointeurdansleregistre desegmentDS

Instrutions sur lesindiateurs

Ilyaonzeinstrutionssurlesindiateursenlangagesymbolique:

Instrution Fontion

LAHF ChargerleregistredesindiateursdansleregistreA

SAHF Rangerleregistre Adansleregistredesindiateurs

PUSHF Sauvegarderleregistredesindiateurssurlapile

POPF Extraireleregistredesindiateursdelapile

PUSHFD SauvegarderEFLAGSsurlapile

POPFD ExtraireEFLAGSdelapile

CLC Mettrel'indiateurCFderetenueà0

CLD Mettrel'indiateurDFdediretionà0

CMC Complémenterl'indiateurCFderetenue

STC Mettrel'indiateurCFderetenueà1

STD Mettrel'indiateurDFdediretionà1

dontlessixpremièressontnouvelles.

Instrutions pour langagesde hautniveau

On retrouveles trois instrutionspour leslangages de haut niveauen langage symbolique,

introduitespourle80186:

Instrution Fontion

BOUND Testdelimites

ENTER Établissementdublodesparamètrespouruneproédure

(41)

7.8.3 Les odes opération

Le ode opération des instrutionsdont le nom symbolique apparaît déjà pourle 8086 est

lemême, àladiéreneprèsquelebit w,indiquanttoujourslalongueurdel'opérande,vaut0

pourunotetet1pourlapleine longueur,'est-à-dire16bitsou32bits suivantleas.

Instrutions detransfert de données

Instrution Format

MOV

RegistreàRegistre/Mémoire 1000 100w mod reg r/m

Registre/MémoireàRegistre 1000 101w mod reg r/m

ImmédiatàRegistre/Mémoire 1100 011w mod 000 r/m

ImmédiatàRegistre 1011 w reg donnée immédiate

MémoireàAumulateur(formeourte) 1010 000 w déplaement omplet

AumulateuràMémoire(formeourte) 1010 001 w déplaement omplet

Registre/MémoireàRegistredeSegment 1000 1110 mod 0 sreg r/m

RegistredeSegmentàRegistre/Mémoire 1000 1100 mod 0 sreg r/m

MOVSX

RegistredepuisRegistre/Mémoire 0000 1111 1011 111w mod reg r/m

MOVZX

RegistredepuisRegistre/Mémoire 0000 1111 1011 011w mod reg r/m

PUSH

Mémoire 1111 1111 mod 110 r/m

Registre 0101 0 reg

RegistredeSegment(ES,CS,SSouDS) 000 sreg 110

RegistredeSegment(FSouGS) 0000 1111 10 sreg 000

Immédiat 0110 10s0 donnée immédiate

PUSHA 0110 0000

POP

Mémoire 1000 1111 mod 000 r/m

Registre 0101 1 reg

RegistredeSegment(ES,CS,SSouDS) 000 sreg 111

RegistredeSegment(FSouGS) 0000 1111 10 sreg 001

Immédiat 0110 10s0 donnée immédiate

POPA 0110 0001

XCHG

Registre/MémoireaveRegistre 1000 011w mod reg r/m

RegistreaveAumulateur(formeourte) 1001 0 reg

IN

PortFixé 1110 010w numéro de port

PortVariable 1110 110w

OUT

PortFixé 1110 011w numéro de port

PortVariable 1110 111w

(42)

Instrutions arithmétiques

Instrution Format

INC

Registre/Mémoire 1111 111w mod 000 r/m

Registre 0100 0 reg

DEC

Registre/Mémoire 1111 111w mod 001 r/m

Registre 0100 1 reg

ADD

RegistreàRegistre 0000 00dw mod reg r/m

RegistreàMémoire 0000 000w mod reg r/m

MémoireàRegistre 0000 001w mod 000 r/m

ImmédiatàRegistre/Mémoire 1000 00 s w mod 000 r/m donnée immédiate

ImmédiatàAumulateur(formeourte) 0000 010 w donnée immédiate

ADC

RegistreàRegistre 0001 00dw mod reg r/m

RegistreàMémoire 0001 000w mod reg r/m

MémoireàRegistre 0001 001w mod 000 r/m

ImmédiatàRegistre/Mémoire 1000 00 s w mod 010 r/m donnée immédiate

ImmédiatàAumulateur(formeourte) 0001 010 w donnée immédiate

SUB

RegistreàRegistre 0010 10dw mod reg r/m

RegistreàMémoire 0010 100w mod reg r/m

MémoireàRegistre 0010 101w mod 000 r/m

ImmédiatàRegistre/Mémoire 1000 00 s w mod 101 r/m donnée immédiate

ImmédiatàAumulateur(formeourte) 0010 110 w donnée immédiate

SBB

RegistreàRegistre 0001 10dw mod reg r/m

RegistreàMémoire 0001 100w mod reg r/m

MémoireàRegistre 0001 101w mod 000 r/m

ImmédiatàRegistre/Mémoire 1000 00 s w mod 011 r/m donnée immédiate

ImmédiatàAumulateur(formeourte) 0001 110 w donnée immédiate

MUL

AumulateuraveRegistre/Mémoire 1111 011w mod 100 r/m

DIV

AumulateurparRegistre/Mémoire 1111 011w mod 110 r/m

NEG

Immédiat 1111 011w donnée immédiate

IMUL

AumulateurparRegistre/Mémoire 1111 101w mod 101 r/m

RegistreparRegistre/Mémoire 0000 1111 1010 1111 mod reg r/m

Registre/MémoireparImmédiatetRegistre 0110 10s1 mod reg r/m donnée immédiate

IDIV

(43)

CMP

RegistreaveRegistre 0011 10dw mod reg r/m

RegistreaveMémoire 0011 101w mod reg r/m

MémoireaveRegistre 0001 100w mod 000 r/m

ImmédiataveRegistre/Mémoire 1000 00 s w mod 111 r/m donnée immédiate

ImmédiataveAumulateur(formeourte) 0011 110 w donnée immédiate

DAA 0010 0111

DAS 0010 1111

AAA 0011 0111

AAS 0011 1111

AAM 1101 0100 0000 1010

AAD 1101 0101 0000 1010

CBW 1001 1000

CWD 1001 1001

(44)

Pourlesinstrutionslogiques,onutiliselehampTTTsuivant:

TTT Instrution

000 ROL

001 ROR

010 RCL

011 RCR

100 SHL/SAL

101 SHR

111 SAR

Instrutionslogiques

Instrution Format

NOT 1111 011w mod 010 r/m

AND

RegistreàRegistre 0010 00dw mod reg r/m

RegistreàMémoire 0010 000w mod reg r/m

MémoireàRegistre 0010 001w mod reg r/m

ImmédiatàRegistre/Mémoire 1000 000w mod 100 r/m donnée immédiate

ImmédiatàAumulateur(formeourte) 0010 010w donnée immédiate

OR

RegistreàRegistre 0000 10dw mod reg r/m

RegistreàMémoire 0000 100w mod reg r/m

MémoireàRegistre 0000 101w mod reg r/m

ImmédiatàRegistre/Mémoire 1000 000w mod 001 r/m donnée immédiate

ImmédiatàAumulateur(Formeourte) 0000110w donnéeimmédiate

XOR

RegistreàRegistre 0011 00dw mod reg r/m

RegistreàMémoire 0011 000w mod reg r/m

MémoireàRegistre 0011 001w mod reg r/m

ImmédiatàRegistre/Mémoire 1000 000w mod 110 r/m donnée immédiate

ImmédiatàAumulateur(Formeourte) 0011 010w donnée immédiate

TEST

Registre/MémoireetRegistre 1000 010w mod reg r/m

ImmédiatetRegistre/Mémoire 1111 011w mod 000 r/m donnée immédiate

ImmédiatetAumulateur(Formeourte) 1010 100w donnée immédiate

ROL, ROR, SAL, SAR, SHL, SHR

RCL, RCR

Registre/Mémoirede1 1101 000w mod TTT r/m

Registre/MémoiredeCL 1101 001w mod TTT r/m

Registre/Mémoiredeimmédiat 1100 000w mod 0 TTT r/m immed 8-bit data

SHLD

Registre/Mémoiredeimmédiat 0000 1111 1010 0100 mod 0 reg r/m immed 8-bit data

Registre/MémoiredeCL 0000 1111 1010 0101 mod 0 reg r/m

SHRD

Registre/Mémoiredeimmédiat 0000 1111 1010 1100 mod 0 reg r/m immed 8-bit data

(45)

Instrutions deontrlede transfert

Instrution Format

JMP

Court 1110 1011 déplaement sur 8 bits

DiretdansleSegment 1110 1001 déplaement omplet

IndiretparRegistre/MémoiredansleSegment 1111 1111 mod 100 r/m

Diretinter-segment 1110 1010 déalage, séleteur

Indiretinter-segment 1111 1111 mod 101 r/m

CALL

DiretdansleSegment 1110 1000 déplaement omplet

IndiretparRegistre/MémoiredansleSegment 1111 1111 mod 010 r/m

Diretinter-segment 1001 1010 déalage, séleteur

Indiretinter-segment 1111 1111 mod 011 r/m

RET

Danslesegment 1100 0011

DanslesegmentenajoutantunimmédiatàSP 1100 0010 16-bit displ

Inter-segment 1100 1011

Inter-segmentenajoutantunimmédiatàSP 1100 1010 16-bit displ

Instrutions de branhement onditionnel

Instrution Format

JO

8-BitDisplaement 0111 0000 8-bit displaement

FullDisplament 0000 1111 1000 0000 full displaement

JNO

8-BitDisplaement 0111 0001 8-bit displaement

FullDisplament 0000 1111 1000 0001 full displaement

JB/JNAE

8-BitDisplaement 0111 0010 8-bit displaement

FullDisplament 0000 1111 1000 0010 full displaement

JNB/JAE

8-BitDisplaement 0111 0011 8-bit displaement

FullDisplament 0000 1111 1000 0011 full displaement

JE/JZ

8-BitDisplaement 0111 0100 8-bit displaement

FullDisplament 0000 1111 1000 0100 full displaement

JNE/JNZ

8-BitDisplaement 0111 0101 8-bit displaement

FullDisplament 0000 1111 1000 0101 full displaement

JBE/JNA

8-BitDisplaement 0111 0110 8-bit displaement

FullDisplament 0000 1111 1000 0110 full displaement

JNBE/JA

8-BitDisplaement 0111 0111 8-bit displaement

FullDisplament 0000 1111 1000 0111 full displaement

JS

8-BitDisplaement 0111 1000 8-bit displaement

(46)

JNS

8-BitDisplaement 0111 1001 8-bit displaement

FullDisplament 0000 1111 1000 1001 full displaement

JP/JPE

8-BitDisplaement 0111 1010 8-bit displaement

FullDisplament 0000 1111 1000 1010 full displaement

JNP/JPO

8-BitDisplaement 0111 1011 8-bit displaement

FullDisplament 0000 1111 1000 1011 full displaement

JL/JNGE

8-BitDisplaement 0111 1100 8-bit displaement

FullDisplament 0000 1111 1000 1100 full displaement

JNL/JGE

8-BitDisplaement 0111 1101 8-bit displaement

FullDisplament 0000 1111 1000 1101 full displaement

JNLE/JG

8-BitDisplaement 0111 1111 8-bit displaement

FullDisplament 0000 1111 1000 1111 full displaement

JCXZ 1110 0011 8-bit displaement

JECXZ 1110 0011 8-bit displaement

LOOP 1110 0010 8-bit displaement

LOOPZ/LOOPE 1110 0001 8-bit displaement

LOOPNZ/LOOPNE 1110 0000 8-bit displaement

Interruptions

Instrution Format

INT

Typespéié 1100 1101 type

Type3 1100 1100

INTO 1100 1110

IRET 1100 1111

BOUND 0110 0010 mod reg r/m

Instrutions deontrle desindiateurs

Instrution Format

STC 1111 1001

CLC 1111 1000

CMC 1111 0101

STD 1111 1101

CLD 1111 1100

STI 1111 1011

CLI 1111 1010

POPF 1001 1101

PUSHF 1001 1100

LAHF 1001 1111

(47)

CLTS 0000 1111 0000 01100

Instrutionsde ontrle duproesseur

Instrution Format

HLT 1111 0100

NOP 1001 0000

WAIT 1001 0000

Instrutionssurles haînes de aratères

Instrution Format

MOVS 1010 010w

INS 0110 110w

OUTS 0110 111w

STOS 1010 101w

LODS 1010 110w

CMPS 1010 011w

SCAS 1010 111w

XLAT 1101 0111

Instrutions onernant lesproédures

Instrution Format

ENTER 1100 0100 16-bit displaement, 8-bit level

LEAVE 1100 1001

Instrutions sur lessegments

Instrution Format

LDS 1100 0101 mod reg r/m

LES 1100 0100 mod reg r/m

LFS 0000 1111 1011 0100 mod reg r/m

LGS 0000 1111 1011 0101 mod reg r/m

(48)

Instrutions de traitementde bits

Instrution Format

BSF 0000 1111 1011 1100 mod reg r/m

BSR 0000 1111 1011 1101 mod reg r/m

BT

Register/Memory,Immediate 0000 1111 1011 1010 mod 100 r/m immed 8-bit data

Register/Memory,Register 0000 1111 1011 0011 mod reg r/m

BTC

Register/Memory,Immediate 0000 1111 1011 1010 mod 111 r/m immed 8-bit data

Register/Memory,Register 0000 1111 1011 1011 mod reg r/m

BTR

Register/Memory,Immediate 0000 1111 1011 1010 mod 110 r/m immed 8-bit data

Register/Memory,Register 0000 1111 1011 0011 mod reg r/m

BTS

Register/Memory,Immediate 0000 1111 1011 1010 mod 010 r/m immed 8-bit data

Register/Memory,Register 0000 1111 1010 1011 mod reg r/m

IBTS 0000 1111 1010 0111

XBTS 0000 1111 1010 0110

Instrutions onditionnellessurles otets

Instrution Format

SETO 0000 1111 1001 0000 mod 000 r/m

SETNO 0000 1111 1001 0001 mod 000 r/m

SETB/SETNAE 0000 1111 1001 0010 mod 000 r/m

SETNB 0000 1111 1001 0011 mod 000 r/m

SETE/SETZ 0000 1111 1001 0100 mod 000 r/m

SETNE/SETNZ 0000 1111 1001 0101 mod 000 r/m

SETBE/SETNA 0000 1111 1001 0110 mod 000 r/m

SETNBE/SETA 0000 1111 1001 0111 mod 000 r/m

SETS 0000 1111 1001 1000 mod 000 r/m

SETNS 0000 1111 1001 1001 mod 000 r/m

SETP/SETPE 0000 1111 1001 1010 mod 000 r/m

SETNP/SETPO 0000 1111 1001 1011 mod 000 r/m

SETL/SETNGE 0000 1111 1001 1100 mod 000 r/m

SETNL/SETGE 0000 1111 1001 1101 mod 000 r/m

SETLE/SETNG 0000 1111 1001 1110 mod 000 r/m

Références

Documents relatifs

Le ompilateur doit traduire un programme soure, érit dans un langage de programmation.. donné, en un

Registres ahés.- Un registre est un élément mémoire inlus dans le miroproesseur..

Nous avons vu, pour l'instant, omment le miroproesseur a aès aux registres et à la mé-..

Langage mahine.- Uun sous-programme peut se trouver dans le même segment que le programme. qui l'appelle : la valeur du registre IP est alors hangée mais il est inutile de

Pour une valeur se trouvant à l'adresse (de mémoire vive) désignée par le ontenu d'uno. registre (de seize bits, puisque 'est la taille du déplaement), on indique le nom de

Jusqu'à maintenant nous avons érit des programmes soit dans un langage évolué (omme le. langage C, Pasal,...), soit dans un

mode protégé : elle doit être égale à la valeur du segment de ode du mode réel (adresse hoisie.. Puisque nous sommes en mode réel, l'adresse physique est égale au ontenu du

Cei doit être eetué à partir d'une page pour laquelle les adresses virtuelles sont. égales aux adresses physiques ( hh identity mapped ii