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