Aide-mémoire Assembleur 80x86

publicité
Aide-mémoire Assembleur 80x86
Procédure d'assemblage
gdb : principales commandes
1. Compilation: nasm -f elf fichier.asm
2. Edition des liens : ld fichier.o -o fichier
gdb fichier : lancement de gdb
break label : dénition d'un point d'arrêt
info break : liste des points d'arrêt
run : exécution du programme jusqu'au premier point d'arrêt
c : exécution jusqu'au prochain point d'arrêt
info registers : valeur des registres du CPU
info variables : liste des variables avec leur adresse
x adresse : valeur contenue à l'adresse mémoire
help commande : ache l'aide
set disassembly-flavor intel : indique que l'on souhaite voir le code
assembleur selon le type Intel
disassemble label : ache le code assembleur à partir de l'étiquette
jusqu'à la suivante
print/fmt valeur : convertit une valeur dans la base indiquée (fmt : t
(binaire), x (hex), d (décimal), c (char))
Structure d'un programme assembleur
[BITS 32]
section .data ; données initialisées
var : db valeur
const equ valeur
section .bss
; données non initialisées
var : resb taille
section .text ; code
global _start ; prog. principal
_start:
...
_end:
mov eax, 1
int 0x80
Notes personnelles
Registres
Registres généraux:
31
16 15
EAX
EBX
ECX
EDX
ESI
EDI
EBP
ESP
Registres d'états:
31
EFLAGS
AH
BH
CH
DH
8 7
SI
DI
BP
SP
AL
BL
CL
DL
0
0
0
EIP
Légende
i
m
r
valeur immédiate
adresse mémoire
registre
Types de variables
db
dw
dd
dq
byte (1 octet)
word (2 octets)
double-word (4 octets)
quad-word (8 octets)
Instructions arithmétiques
add mr, mri
sub mr, mri
inc
dec
neg
div
mr
mr
mr
mr
mul mr
imul mr
idiv mr
mr ← mr + mri
mr ← mr − mri
add et sub : un seul m parmi les param.
mr ← mr + 1
mr ← mr − 1
mr ← −mr (complément à 2)
division d'entiers non signés:
{al|ax|eax} ← {ax|dx:ax|edx:eax} ÷ mr
{ah|dx|edx} ← {ax|dx:ax|edx:eax} mod mr
multiplication d'entiers non signés :
{ax|dx:ax|edx:eax} ← {al|ax|eax} × mr
la taille de mr détermine les registres impliqués :
mr = 8 bits → ax et al
mr = 16 bits → dx:ax et ax
mr = 32 bits → edx:eax et eax
comme mul, mais pour des entiers signés
comme div, mais pour des entiers signés
(AX
(BX
(CX
(DX
=
=
=
=
{AH et AL})
{BH et BL})
{CH et CL})
{DH et DL})
Registres de segments:
Pointeur d'instruction:
31
accu et retour fct
oset dans DS
compteur
entrées/sorties
pointeur source
pointeur destination
pointeur début de pile
pointeur bas de pile
16
CS
DS
SS
ES
FS
GS
0
segment
segment
segment
segment
segment
segment
de
de
de
de
de
de
code
données
pile
données
données
données
Instructions de déplacement
mov mr, mri
push mri
pop mr
mr ← mri
empile mri
dépile dans mr
Formats de valeurs
14
1110b
0eh ou 0x0e
décimal
binaire
héxadécimal
Instructions logiques bit à bit
and mr, mri
or mr, mri
xor mr, mri
not mr
shl mr, i
shr mr, i
sal mr, i
sar mr, i
rol mr, i
ror mr, i
rcl mr, i
rcr mr, i
mr ← mr ∧ mri
mr ← mr + mri
mr ← mr ⊕ mri
mr ← mr
décalage à gauche de i positions,
bit de gauche mis dans CF
comme shl, mais à droite
shl et shr : bit(s) inséré(s) = 0
idem shl
idem shr, bit inséré = bit de poids fort
rotation vers la gauche de i positions,
bit de gauche copié dans CF
comme rol, mais à droite
rotation vers la gauche de i positions
en passant par CF
comme rcl, mais à droite
Instructions de contrôle de ot
call lbl
ret
int i
jmp lbl
cmp mr, mri
loop lbl
loopz lbl
loopnz lbl
Notes personnelles
empile eip et saute à lbl
dépile dans eip
empile eflags, cs et eip puis appelle
l'interruption i
saut inconditionnel à lbl
calcul de mr − mri et modie eflags
décrémente ecx et saute à lbl si ecx 6= 0
déc. ecx et saute à lbl si ecx 6= 0 et ZF = 1
déc. ecx et saute à lbl si ecx 6= 0 et ZF = 0
sauts conditionnels:
ja above
jae
jb below
jbe
jg greater jge
Signé
jl lower
jle
jc cf=1
jz
jo of=1
js
je equal
+ versions négatives en rajoutant
above or equal
below or equal
greater or equal
lower or equal
Non signé
zf=1
sf=1
n : jn*
Instructions sur les tableaux d'octets
Conversions de données
esi et edi
eflags (df=0→incrémentation, df=1→décrémentation).
Il y a incrémenttion ou décrémentation automatique de
df
dans
lods{b|w|d}
stos{b|w|d}
movs{b|w|d}
cmps{b|w|d}
scas{b|w|d}
rep instr
repe instr
repne instr
copie l'octet/mot/double mot de esi dans al|ax|eax
le contenu de al|ax|eax est copié dans la case pointée par edi
copie un octet/mot/double mot de esi dans edi
compare les octets/mots/double mots en esi et edi:
si idem, zf←1, sinon zf←0
compare le contenu de al|ax|eax avec l'octet/mot/double mot en
edi: si idem, zf←1, sinon zf←0
répète ecx fois l'instruction instr
répète instr tant que zf=1, ou au maximum ecx fois
répète instr tant que zf=0, ou au maximum ecx fois
Manipulation des indicateurs
clc
stc
cld
std
lahf
sahf
pushfd
popfd
suivant la valeur de
positionne cf dans eflags à 0
positionne cf dans eflags à 1
positionne df dans eflags à 0
positionne df dans eflags à 1
ah ← 8 bits de poids faible de eflags
8 bits de poids faible de eflags ← ah
empile eflags sur la pile
dépile dans eflags
cwd
Convert Word to Double-word :
cwde
cdq
étend al à ax
étend ax à dx:ax
Convert Word to Double-word :
étend ax à eax
Convert Double-word to Quadword :
étend eax à edx:eax
Extension eectuée en recopiant le bit de
poids fort dans les bits rajoutés.
Appel des fonctions Linux via l'instruction:
Paramètres à xer :
Fonction
exit
read
write
eax∗
1
3
4
ebx
code de sortie
#
descripteur
#
descripteur
int 0x80
ecx
edx
@ buer in
nb octets à lire
@ buer out
nb octets à écrire
read, eax contient le nombre d'octets eectivement lus
write, eax contient le nombre d'octets eectivement écrits
#
descripteur : 0=stdin, 1=stdout, 2=stderr
∗
après un
Liens utiles et notes personnelles
Sites web:
ˆ http://www.nasm.us/
ˆ http://asm.sourceforge.net/
ˆ http://faydoc.tripod.com/cpu/
ˆ http://www.penguin.cz/~literakl/intel/intel.html
ˆ http://www.drpaulcarter.com/pcasm/
Convert Byte to Word :
Appels système
après un
ˆ http://www.lxhp.in-berlin.de/lhplinks.html
cbw
Téléchargement