chmod file 555 chmod go-r file
; 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
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
Comme promis, j'explique ici le point algorithmiquement “difficile” du TD.
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
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]