Cours 2 : Architecture, Console, Assembleur
Intro : Suite
- Entiers (machine) :
- non signés : de $0$ à $2^n-1$
- signés (complément à 2) : $-2^{n-1}$ à $2^{n-1}-1$
- Caractères :
- ASCII (VS : EBCDIC)
- Unicode, UTF-8 (8 bits jusqu’à 4 octets)
- ∃ aussi UTF-16 (16 bits par défaut), UTF-32 (caractères codés sur 32 bits)
Compiler un code en C avec debugger :
gcc -ggdb -O0 cat.c -o mycat
gcc
: compilateur domaine public
Debugger :
lldb mycat
(OU :gdb
)
(lldb) run a b
Sous UNIX : tout programme renvoie un code pour dire si l’exécution s’est bien passée (si code = 0 : pas de pb).
Lorsqu’on lance une commande : lance un processus (numéro du processus = Process Identification Number)
Attention : il y a des attaques qui se basent sur le numéro du processus suivant (donc sous Linux : numéro au hasard MAIS Mac : numéro = i+1)
En hexadécimal : préfixe = 0x
- Ex:
- décimal : 123
- hexa :
0x7B
- binaire :
01111011
- octal :
0173
(préfixe :0
)
Pourquoi en hexadécimal ? 16 = 2^4 ⟶ demi-octet (notation compacte) On veut la représentation en binaire, MAIS : en binaire : trop verbeux (1 octet = 8 bits).
7 B
0111 1011
NB : ∃ octal ⟶ pq, alors que 8 pas multiple de 3 ?
-
Parce que : cf. permission (read - write/erase - execute)
d
: directory /-
: fichier normal- premier groupe : utilisateur
- deuxième : groupe de l’utilisateur
- troisième : autres personnes
Comme il y a 3 caractères (r-w-x) ⟶ octal
Changer les autorisations :
chmod o -x myfichier
: les autres (others)
OU : chmod 0755 myfichier
0755
: en octal
(lldb) b main
⟶ breakpoint main
C = Langage impératif :
- Affectation :
- C :
x = e;
,x[i] = e;
if (x == y+1) c1; else c2;
- Attention :
if (x = y+1)
: une affectation est une expression, qui a une valeur (ex:3;
mais ne fait rien) ⟶x=3
: met3
dansx
, et retourne3
- Pq retourne 3 ? Pour que
x=y=3;
soit possible
En C : tout est un entier (suite de bits) ⟶
0
= booléenfalse
, n’importe quoi d’autre non nul =true
Types :
int
=signed int
,unsigned int
,long int
=long
(= entiers signés au moins aussi larges queint
(en pratique : 64bits))Sur une machine 64bits :
int
sur 32 bitsshort
,unsigned short
: sur 16bitschar
⟶ seul type de donnée exactement sur 1octet,unsigned char
,signed char
- Pq retourne 3 ? Pour que
- Attention :
- Pascal :
x := e x[i]:= e
: pourquoi:=
? Inventeur du Pascal : “ce n’est pas l’égalité mathématique” ⟶ en informatique, il serait logique que le=
soit réservé au test d’égalité.- Pascal :
if x=y+1 then ... else ...
- Pascal :
- C :
NB : 123
(qui loge sur 1octet) est un char
(char)123
⟶ (char)
: le “cast”, on force le type
p (char)123
(print …)
En ASCII : dans les 32 premiers codes ⟶ caractères de contrôle.
En UTF-8 : rétrocompatibilité (cf. wikipedia)
mycat a b
⟶ argv
tableau contenant
- 0 → chemin absolu de mycat
- 1 → a
- 2 → b
- 3 → NULL
- 4 → variables d’environnement
argc
: taille “officielle” (nb arguments + 1) de argv
(=3 ici)
FILE *f;
pointeur fichier
f = fopen(argv[i], "r")
fgetc(f)
: obtenir le prochain caractère dans f
while ((c=fgetc(f)) != EOF)
: parenthèses autour de c=fgetc(f)
pour ne pas avoir de suggestion d’erreur “avez-vous confondu =
et ==
?”
EOF
= End Of File : quand on arrive au bout du fichier, caractère spécial.
Pour EOF :
- MSDOS : reserve le code de
ctrl-Z
à la fin du fichier (vs: fichier exécutable : se termine autrement) - Unix : la fin de fichier = -1 = FF (= que des 1, en complément à deux VS 255 =
0⋯01⋯1
), mais ne se loge pas sur unchar
= 8 bits. DONC c’est pour ça qu’on impose le typeint
àc
Pq fputc(c, stdout)
n’affiche pas c
tout de suite ? Parce que va dans un tampon : tableau de tous les caractères en attente d’affichage
⟶ puis : quand rempli OU quand on vide le tampon avec fflush(stdout);
, affiche le contenu en faisant passer les instructions jusque dans le kernel.
\n
: code 10 ⟶ saut à la ligne (sous Unix)\t
: tabulation\r
: code 13 ⟶ retour chariot ⟹ sous Windows : passage à la ligne :\r\n
Mémoire = un tableau d’octets (2^32 entrées ≃ 4.10^9)
Adresses = entiers ⟶ stockables en mémoire (adresses = pointeurs)
Micro-processeur (Micro : dans les années 70 ⟶ processeur réduit dans un circuit intégré) = processeur.
(1 coeur = 1 micro-processeur)
Mémoire + processeur ≃ Machine de Turing
Machine de Turing universelle : MT codée comme une structure arborescente ⟶ On peut lui donner un programme et des données en argument.
- Avant : ordinateurs ne savaient faire qu’un truc
- ≃ 1940 : Von Neumann : mieux que l’ordi soit une MT universelle
Convention de l’assembleur Intel : %
= préfixe d’un registre
$
= préfixe d’une constante entière
pc
(program counter) ⟶ ‘eip’
Pourquoi les registres commencent par %
et e
? À cause du premier Intel 4004 : 4 bits, 4 processeurs
- Puis : Intel 8008 : 8 processeurs
IBM sort le Personal Computer pour concurrencer l’Apple2, Comodore, etc…
Pourquoi Intel a survécu ? Parce qu’IBM les a choisis (ils vendaient le processeur 16bit le moins cher).
ax
,bx
, etc… les registres 16 bits des anciennes versionsa
,b
…-
eax
: extendedax
, … : les versions 32 bits - registre
esp
: pointeur de pile, mais se manipule comme un registre normal.
La mémoire ≃ un livre (de 4.10^9 pages) Les registres ≃ le crâne de l’utilisateur
On empile sur le sommet de pile, qui lui-même est en bas (=gauche).
- Processeur Intel = Little Endian : stocke l’octet de poids faible d’abord, jusqu’à l’octet de poids fort (à l’envers, dans la pile)
- Processeur Motorolla = Big Endian : stocke l’octet de poids fort d’abord, jusqu’à l’octet de poids faible (à l’endroit)
Endianness ⟶ Problèmes dans les protocoles réseau : ex: carte réseau reçoit les données en Little OU Big Endian ?
- Système de fenêtrage : système X-window ⟶ on peut se connecter à distance sur notre machine et avoir des fenêtres.
Protocole X-Window : en quel Endian ?
- Malin : le protocole cherche un compromis d’endianness entre le client et le serveur
Assembleur : mov esp ebp
: copie esp dans ebp.
sub a b
: soustraitb
àa
, valeur qui est stockée dansa
Modes d’adressage :
- Mode registre :
%eax
: le contenu du registre eax - Mode immédiat :
$114
: la constante 114 - Mode absolu :
114
: contenu de la mémoire à l’adresse 114. - Mode indirect :
(%eax)
: contenu de la mémoire à l’adresse qui est la valeur deeax
. - Mode indirect avec déplacement (=offset) :
12(%eax)
: contenu de la mémoire à l’adresse qui est la valeur de eax+12.-12(%eax)
: contenu de la mémoire à l’adresse qui est la valeur de eax-12.12(%eax,%ebx,4)
(multiplicateur : 1,2,4 ou 8): contenu de la mémoire à l’adresse qui est la valeur de eax + 4*ebx - 12
En vrai : pas mov
, mais movl
(32 bits), movq
(64 bits), movb
(byte) …
Microprocesseur :
- Avant ≃ employé de banque : chaque action prenait un cycle d’horloge (une instruction à la fois)
-
Maintenant ≃ employé super speed : donne des instructions à des factotum qui font les différentes instructions à plusieurs en même temps
- Une personne par instruction = pipeline (lecture, décodage, exécution) : travail à la chaîne
- Aujourd’hui : plusieurs instructions en parallèle, où chaque unité de calcul a ses propres “copies fantômes” des registres pour connaître les priorités.
VHDL (Langage de Hardware) ⟶ Autres langages plus proches du matériel (portes logiques, etc …) : ≃ 15 couches
rbp
: équivalent deebp
, mais version 64 bits.
Que se passe-t-il en assembleur pour la boucle for
?
int main(int argc, char **argv)
{
int i, c;
for(i=1; i < argc; i++)
{
FILE *f;
}
}
Leave a comment