Wiki ~ namok.be

MIC1 Errata divers

TD3-linux1

  • Dans l'exemple comparatif, les constantes devraient s'écrire en majuscule, soit DEUX –Pbt
  • À la page 3, on vous informe qu'il est possible de compiler via gcc. Dans notre cas, on compile en utilisant nasm. On peut par contre faire l'édition des liens avec gcc ou ld. –Pbt
  • À la page 3, on vous parle d'un fichier SurfTri.exe, c'est une erreur, c'est bien SurfTri. Conceptuellement, on peut ajouter une extension .exe aux binaires sous linux mais ce n'est pas l'habitude. Par convention, les fichiers binaires n'ont pas d'extensions et s'écrivent tout en minuscules. –Pbt
  • À la page 5, pour l'exercice utilisant l'intruction chmod, on vous parle de la syntaxe “octale” du l'instruction, pas de sa syntaxe “+/-”. Remarquez qu'avec nasm vous pouvez utiliser le préfixe 0 pour les nombres octaux ou le suffixe q. À votre meilleure convenance. –Pbt
chmod file 555  
chmod go-r file
  • À la page 7 dans l'exercice portant sur monCat, on vous propose d'utiliser fflush pour imposer l'écriture du buffer. Ça ne fonctionnera pas ! C'est l'OS qui bufferise et la librairie C (stdio) ne peut rien y faire –même sync ne sera pas utile dans ce cas car je ne traite pas de disque mais stdout et stdin. –Pbt
  • Toujours dans le même ordre d'idée, je signale qu'il faut éviter de mélanger les appels systèmes read/write avec les fonctions de la librairie stdio genre … fflush, putchar, getchar … en petit cadeau, deux codes pour moncat; un code “bas niveau” et un code de plus “haut niveau”.
; nasm moncat-2-int80.asm -f elf 
; ld moncat-2-int80.o -o moncat-2-int80 
; 
; Pas de possibilité d'écrire fflush dans ce code 
; (il vaut mieux éviter de mélanger syscall (read/write) et 
; stdio
 
SECTION .data
buf	DB 	0
 
SECTION .code
GLOBAL _start
_start:
 
.while
	; read 3 (fd,buf, count)
	mov EAX,3 
	mov EBX,0
	mov ECX,buf
	mov EDX,1
	int 0x80
	cmp EAX,0
	jle .endwhile
	; write 4 (fd, buf, count) 
	mov EAX,4
	mov EBX,1
	mov ECX,buf
	mov EDX,1
	int 0x80
	jmp .while
.endwhile 	
 
mov EAX,1
mov EBX,0
int 0x80
; nasm moncat-3-stdio.asm -f elf
; gcc moncat-3-stdio.o -o moncat-3-stdio
 
EXTERN getchar
EXTERN putchar 
EXTERN fflush 
 
EOF EQU -1 
 
SECTION .data
c	DD	0
 
SECTION .code
GLOBAL main
main
 
.while
	call getchar
	mov [c],EAX
	cmp EAX,EOF
	je .endwhile
	push dword [c]
	call putchar
	add esp,4*1
	; Un fflush ne change rien, l'OS n'autorise pas un flush après chaque
	; char
	;push dword 0
	;call fflush
	;add esp,4*1
	jmp .while
.endwhile	
ret

TD2-dos2

  • Page 1, remplacer le label SI par un autre, puisque SI représente un label.
  • Page 1, code d'exemple, remplacer jne alors par je sinon. Adapter le commentaire en conséquence.
  • Exercice 5, remplacer le '6' par un '8' dans l'exercice sur les masques et les divisibilités par 2^i
  • Exercice 5, shl, devient shr.

Remarques générales

Les conventions d'écriture 1) ne sont pas les mêmes que dans les slides. Pour rappel, on utilise les majuscules pour les directives et les registres et des minuscules sinon. –Pbt

Au sujet des différents modes d'adressage que l'on vous conseille de relire. Vous pouvez consulter le document d'intel (PDF) au point 3.7, page 3.26, page 86 du pdf. Le point 3.7.5 à la page 88 du document vous intéressera plus particulièrement. –Pbt

Questions

Archives

(2006-2007) TD3-linux, Le jeu de l'oie

Comme promis, j'explique ici le point algorithmiquement “difficile” du TD.

Aspect logique

Il s'agit de parcourir un tableau (plateau) de la forme

1 2 3
8 9 4
7 6 5

La manière la plus simple (à mon sens) est de me créer un tableau (parcours) faisant le lien entre le plateau et mon avancée sur ledit plateau. Mon avancée est renseignée dans une variable position simplement incrémentée de la valeur du dé. Ma position commence à 0 lorsque je me trouve sur la case 1

Comme en assembleur tous les tableaux sont des tableaux à une dimension (les autres sont une “vue de l'esprit”), je vais associer à chaque valeur son index (je le note entre parenthèses afin de bien montrer sa valeur). J'ai donc

1(0) 2(1) 3(2)
8(3) 9(4) 4(5)
7(6) 6(7) 5(8)

Mon tableau parcours permettant le lien entre ma position (avancée) et ma position sur le plateau sera

parcours = 0 1 2 5 8 7 6 3 4 

Ainsi, si je suis sur la case 2 (position 1) et que j'avance de 3 -ma position devient 4- je me déplace dans mon plateau à la position, parcours[4], soit 8 … et je suis bien sur la case 5 du plateau de jeu (cette dernière phrase doit se lire lentement).

Notez bien : Ne passez à la section suivante qu'après avoir bien compris cette section ;-)

Techniquement en assembleur

En assembleur, je dois tenir compte de quelques aspects techniques. En effet, je veux afficher le plateau, il doit donc être composé de caractères et pas de “valeurs”. Je dois aussi marquer le retour à la ligne. La numérotation de parcours change puisque je dois tenir compte de la case retour à la ligne

1(0) 2(1) 3(2) LF(3)
8(4) 9(5) 4(6) LF(7)
7(8) 6(9) 5(10) LF(11)

Et voilà ce que ça donne en assembleur.

plateau  DB " 1 "," 2 "," 3 ","  ",10
         DB " 8 "," 9 "," 4 ","  ",10
         DB " 7 "," 6 "," 5 ","  ",10
 
parcours DB 0,1,2,6,10,9,8,4,5 
position DB ?   ; mon avancée dans le jeu

J'ai choisi de prendre 3 caractères pour représenter une case, ma “correspondance” se fera donc avec quelque chose de la forme (que vous traduirez en assembleur)

plateau[parcours[position]*3]
1)
Ce sont bien des conventions, ce n'est pas imposé par le compilateur