Les instrutions du mode 64 bits
Ayantsaisileprinipedeompatibilitédesmiroproesseursd'Intel,onpeutpenserquel'on
varetrouverdanslemode64 bitsle même jeu d'instrutionsen ode mahine qued'habitude,
avepossibilitéd'adresse etd'opérandesur64bits, ainsiquedesinstrutionsnouvelles.En fait
en'estpastout àfaitleas:ertainsodesopérationontdisparu dansemode(onduisantà
unefaute
hh
odeopérationnonvalideii
lorsqu'ilssontutilisés);lasigniationdeertainsodes opérationahangée;lasigniationd'undesmodesd'adressageahangé.Est-edûaufaitquelemode64bitsaétéonçuparAMDetnonparIntel?
Ceiaévidemmentdesonséquenespourlesprogrammes.Lesprogrammesdoiventsystéma-
tiquementêtrereompilés(lorsqu'ilssontérits,disons,enlangageC)ouréassemblés(lorsqu'ils
sontéritsenlangaged'assemblage)avantdepouvoirêtreexéutésenmode64bitsalorsquee
n'est pasle asen mode longompatible (d'où le nom). Mais une simplereompilation ouun
simpleréassemblagen'estpassusant:ertainsprogrammesexigentuneadaptation.Beauoup
d'adaptations seront transparentes au programmeur, le ompilateur ou l'assembleur faisant le
travailàsaplae, maisein'estpastoujoursleas.
15.1 Les instrutions en mode 64 bits
15.1.1 Certains hangements dans les odes opération
Certainesinstrutionsdisparaissentpurementetsimplementenmode64bits:
Instrution Opode Signiation
AAA 0x37 ASCIIAdjustafterAddition
AAD 0xD5 ASCIIAdjustAXbeforeDivision
AAM 0xD4 ASCIIAdjustAXafterMultipliation
AAS 0x3F ASCIIAdjustafterSubstration
BOUND 0x62 ChekArrayAgainstBounds
CALL(far) 0x9A Farabsolute
DAA 0x27 DeimalAdjustALafterAddition
DAS 0x2F DeimalAdjustALafterSubstration
INTO 0xCE InterrupttoOverowVetor
JMP(far) 0xEA JumpFar(absolute)
POP DS 0x1F
POP ES 0x07
POP SS 0x17
POPA,POPAD 0x61 POPALLtoGPR WordsorDoublewords
PUSH CS 0x0E
PUSH DS 0x1E
PUSH ES 0x06
PUSH SS 0x16
PUSHA,PUSHAD 0x60 PushAlltoGPRWordsorDoublewords
SALC 0xD6 SetALAordingtoCF
SYSENTER 0x0F 34 SystemCall
SYSEXIT 0x0F 35 SystemReturn
Certainesdisparaissentarleuropodeestréutilisé:
Instrution Opode Signiation Nouvelleutilisation
ARPL 0x63 AdjustRequestorPrivilegeLevel MOVSXD
DEC 0x484F Derementation REXprex
INC 0x4047 Inrementation REXprex
LDS 0xC5 LoadDSFarPointer VEXprex
LES 0xC4 LoadESFarPointer VEXprex
Commentaires.- 1
o
) Pour les instrutions INC et DEC, seules disparaissent les odages de es
instrutions sur un otet onernant les registres généraux, par exemple INC AX. On peut les
oderautrementenutilisantl'opode0xFFsuividel'otetModR/M.
-2
o
)Leodeopération0x90del'instrutionNOPontinueàexisterparompati-
bilitéasendantemaisils'agitenfaitd'unaliasdel'instrutionXCHG EAX, EAX.
15.1.2 Nouvelle interprétationdes déplaements
Contexte.-Pouraherunaratèreaudébutdeladeuxièmelignedel'éran,nousavonsutilisé,
enmodeprotégé,l'instrutionsuivante enadressagediret :
movb %al,(0xB80A0)
'est-à-direquenousavonsplaéleontenuduregistreALàl'adresseabsolue0xB80A0,l'adresse
debasedeDSétant0.
L'adressedebasedusegment(deode)étanttoujours0enmode64bits,onesttentéd'utiliser
lamêmeinstrutionpoureetuerlamême opération.Maiselanemarhepas.
Déplaement.- Dans leas de l'adressagediret,l'opérande (la onstante plaéeentre rohets
danslareprésentationenlangagesymbolique)estundéplaementdisp.Lasigniationdeelui-
iestdiérente suivantlemoded'opérationutilisé:
Enmoderéel,l'adresseorrespondanteest:
CS × 0x10 + disp
Enmodeprotégé etenmodeompatible,ona:
base + disp
où
base
estl'adressedebasedusegmentdesdonnéesdeséleteurDS.Enmode64bits, ledéplaementest relatifauregistred'instrutionRIP:
RIP + disp
RIPontenantl'adressedel'instrutionquisuitl'instrutiondanslaquelleonutiliseledé-
plaement.Ledéplaementesttoujoursunentierrelatifodésur32bitsmaiselapermet
deparourirtoutl'espaeadressablepuisque RIPontientunevaleurodéesur64bits.
Onparledemode d'adressagerelatif auRIP(RIPrelative addressing).
Exemple.-Reprenonsnotrepremierexempledeodeéritenmode64bits:
org 0x60000
use64
mov rax,'L O N G '
mov [0xB80A0℄,rax
jmp $
dontl'assemblageonduità:
48 B8 4C 20 4F 20 4E 20 47 20
48 89 05 8F 80 05 00
EB FE
L'instrutionJMPsuivantl'instrutionMOVquinousintéresseadonundéalagede17,soit0x11,
relativementàl'origine0x60000.LeontenudeRIPestdon0x60011.Ledéalagedelaseonde
instrutionMOVest0x5808F,ommeonpeutlevoirsurleodemahine.
LeontenudeRAXseradonplaéen:
0x60000 + 0x11 + 0x5808F = 0xB80A0
Casdulangaged'assemblage.-Commenousvenonsdelevoir,l'assembleurnousaide:onplae
ommedéplaementequel'onaimeraitobteniretl'assembleurtraduitenodemahineequ'il
faut.
Cetteaideest bienvenuemaisaseslimites :ilfautonnaîtrel'emplaementdel'instrution.
Nous avons utilisé la diretive ORG dans e as puisque nous savions où allait être plaé le
programme.Maise n'estpastoujoursleas.
Leprogrammeainsiobtenun'estpasrelogeable.
15.2 Exemples de programmes
15.2.1 Programme d'appliation en 64 bits
Jusqu'iinousavonssurtoutéritdesprogrammesditssystème.Maintenantquenousavons
omment passer aumode 64 bits et revenir au mode réel,nous pouvons remplaer notre pro-
grammed'exempleenmode64bits,àsavoirl'ahagede`LONG', pare quenousvoulons.
Érivons,parexemple,unprogrammeeetuantuneadditionsur64bitsetplaçantlerésultat
ànotreadressehabituelle6000:0,pourpouvoirvérierqueelaabienétéeetuélorsqu'onest
revenuenmoderéel.
Ilsutderemplaer,dansleprogrammeboot5.asm,l'exempleenmode64bits:
;
; Sample in 64-bit mode
;
use64
suiteL:
mov rax,'L O N G '
mov ebx,0B80A0h
mov [ebx℄,rax
par:
;
; Sample in 64-bit mode
;
use64
suiteL:
mov rax,12345678h
shl rax,32
add rax,12345678h
mov ebx,60000h
mov [ebx℄,rax
Pourne pas plaer de valeurimmédiate de plus de 32 bits dans leregistre 64 bits RAX,on
yplae une onstante 32bits, quel'on déplae dans ledouble motde poids fort,àlaquelle on
ajouteune autreonstante 32bits (iilamême),puisonplae leontenuduregistre64bits à
l'emplaementvoulu.
Après avoir assemblé le programme, disons boot6.asm, ave FASM et l'avoir plaé dans le
répertoireBOOTdenotrelé USBdémarrantsurMS-DOS, onexéuteleprogramme:
C:\BOOT>debug
-D 6000:0 L 10
6000:0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ...
-q
C:\BOOT>boot6.om
C:\BOOT>debug
-D 6000:0 L 10
6000:0 78 56 34 12 78 56 34 12-00 00 00 00 00 00 00 00 xV4.xV4...
-q
equionrmequel'additionabienétéeetuéesur64bitsetqueletransfertàl'adresse6000:0