Sie sind auf Seite 1von 71

Les piles

Djamal Rebane

Utilit d'une pile Une pile est une zone de mmoire dans laquelle on peut stocker temporairement des registres. Il s'agit d'un moyen d'accder des donnes en les empilant, telle une pile de livre, puis en les dpilant pour les utiliser. Ainsi il est ncessaire de dpiler les valeurs stocker au sommet (les dernires avoir t stockes) pour pouvoir accder aux valeurs situes la base de la pile. En ralit il s'agit d'une zone de mmoire et d'un pointeur qui permet de reprer le sommet de la pile. La pile est de type LIFO (Last In First Out), c'est--dire que la premire valeur empile sera la dernire sortie (Si vous empilez des livres, il vous faudra les dpiler en commenant par enlever les livres du dessus. Le premier livre empil sera donc le dernier sorti!). Les instructions PUSH et POP Les instructions PUSH et POP sont les instructions qui servent empiler et dpiler les donnes. PUSH registre met le contenu du registre dans la pile (empilement) POP registre rcupre le contenu de la pile et le stocke dans le registre (dpilage

Djamal Rebane

Ainsi, l'instruction PUSH BX empile le contenu du registre BX, et l'instruction POP AX rcupre le contenu du sommet de la pile et le transfre dans AX.

Djamal Rebane

Utilisation de la pile sur un exemple Dans l'exemple suivant, que l'on imaginera au milieu d'un programme, on stocke les valeurs contenues dans AX et BX pour pouvoir utiliser ces deux registres, puis une fois l'opration accomplie on remet les valeurs qu'ils contenaient prcdemment...

Djamal Rebane

PUSH AX PUSH BX MOV AX, [0140] ADD BX, AX MOV [0140], BX POP BX POP AX

Djamal Rebane

Les registres SS et SP Les registres SS et SP sont deux registres servant grer la pile:
SS (Stack Segment, dont la traduction est segment de pile) est un registre 16 bits contenant l'adresse du segment de pile courant. Il doit tre initialis au dbut du programme SP (Stack Pointer, littralement pointeur de pile) est le dplacement pour atteindre le sommet de la pile (16 bits de poids faible).

Djamal Rebane

SP pointe vers le sommet, c'est--dire sur le dernier bloc occup de la pile. Lorsque l'on ajoute un lment la pile, l'adresse contenue dans SP est dcrmente de 2 octets (car un emplacement de la pile fait 16 bits de longueur). En effet, lorsque l'on parcourt la pile de la base vers le sommet, les adresse dcroissent. Par contre l'instruction POP incrmente de 2 octets (16 bits) la valeur de SP.

Djamal Rebane

PUSH: SP <- SP - 2 POP: SP <- SP + 2

Ainsi, lorsque la pile est vide SP pointe sous la pile (la case mmoire en-dessous de la base de la pile) car il n'y a pas de case occupe. Un POP provoquera alors une erreur...
Djamal Rebane 8

Dclarer une pile Pour pouvoir utiliser une pile, il faut la dclarer, c'est--dire rserver un espace mmoire pour son utilisation, puis initialiser les registres avec les valeurs correspondant la base de la pile, ainsi que son sommet (rappel: situ sous la pile lorsque celle-ci est vide). Ainsi pour dfinir une pile, il s'agit tout d'abord de la dclarer grce la directive SEGMENT stack.
Djamal Rebane 9

Dclaration d'une pile Pour utiliser une pile en assembleur, il faut dclarer un segment de pile, et y rserver un espace suffisant. Ensuite, il est ncessaire d'initialiser les registres SS et SP pour pointer sous le sommet de la pile. Voici la dclaration d'une pile de 200 octets : segment_pile SEGMENT stack ; mot clef stack pour pile DW 100 dup (?) ; rserve espace base_pile EQU this word ; etiquette base de la pile segment_pile ENDS Noter le mot clef ``stack '' aprs la directive SEGMENT, qui indique l'assembleur qu'il s'agit d'un segment de pile.
Afin d'initialiser SP, il faut reprer l'adresse du bas de la pile; c'est le rle de la ligne base_pile EQU this word (voir figure suivante).

En fait loprateur this word (ne pas oublier que les lments dun pile sont des mots) cre une adresse mmoire qui est le mot suivant et lassigne bas_pile. Comme les adresse dune pile sont dans lordre dcroissant, cette adresse en dessous de ladrese du dbut de la pile.
Djamal Rebane 10

Autrement dit, la dclaration suivante:


First-byte equ this byte Word table dw 100 dup(?)

permet dassigner un nom au premier octet de ladresse de word-table.

Djamal Rebane

12

Suite aux dclarations, il faut crire une squence d'initialisations:


ASSUME SS:segment_pile; gnre une adresse pour lemplacement de la ; pile MOV AX, segment_pile MOV SS, AX ; initialise le segment de pile MOV SP, base_pile ; copier l'adresse de la base de la pile dans SP

Remarquez quil n'est pas possible de faire directement MOV SS, segment_pile car cette instruction n'existe pas!

Djamal Rebane

13

Les procdures-fonctions
La notion de procdure - fonctions En langage assembleur, on appelle procdure un sousprogramme qui permet d'effectuer un ensemble d'instructions par simple appel de la procdure. Cette notion de sous-programme est gnralement appele fonction dans d'autres langages. Les fonctions et les procdure permettent d'excuter dans plusieurs parties du programme une srie d'instruction, cela permet une simplicit du code et donc une taille de programme minimale. D'autre part, une procdure peut faire appel elle-mme, on parle alors de procdure rcursive (il ne faut pas oublier de mettre une condition de sortie au risque sinon de ne pas pouvoir arrter le programme...).
Djamal Rebane 14

Djamal Rebane

15

La dclaration d'une procdure tant donne qu'une procdure est une suite d'instructions, il s'agit de regrouper les instructions composant la procdure entre des mots cls. L'ensemble de cette manipulation est appele dclaration de procdure. Ces mots cls permettant la dclaration de la procdure sont le 1. une tiquette (qui reprsente le nom de la fonction) prcdant le mot clef PROC marquant le dbut de la procdure, suivi de near (qui signale que la procdure est situe dans le mme segment que le programme appelant) et RET dsignant la dernire instruction, et enfin le mot-cl ENDP qui annonce la fin de la procdure.

2. 3.
4. 5.

Ainsi une dclaration de procdure ressemble ceci:

Djamal Rebane

16

Etiquette PROC near instruction1 instruction2 ... RET


Etiquette ENDP

Djamal Rebane

17

Appel d'une procdure C'est la directive CALL qui permet l'appel d'une procdure. Elle est suivie soit d'une adresse 16 bits, dsignant la position du dbut de la procdure, ou bien du nom de la procdure (celui de l'tiquette qui prcde le mot cl PROC).

Djamal Rebane

18

Comment l'appel et la fin de la procdure Lorsqu'on appelle une procdure, la premire adresse de la procdure est stocke dans le registre IP (pointeur dinstruction), le processeur traite ensuite toutes les lignes d'instructions jusqu' tomber sur le mot cl RET, qui va remettre dans le registre IP l'adresse qui y tait stock avant l'appel par PROC. Cela parat simple mais le problme provient du fait que les procdures peuvent tre imbriqus, c'est--dire que de saut en saut, le processeur doit tre capable de revenir successivement aux adresses de retour. En fait, chaque appel de fonction via l'instruction CALL, le processeur empile l'adresse contenue dans le registre IP (il pointe alors sur l'instruction suivant l'instruction CALL) avant de la modifier, l'appel de l'instruction RET (qui ne prend pas d'arguments) le contenu de la pile est dpil puis stock dans le registre IP.

Djamal Rebane

19

Djamal Rebane

20

Voici un exemple dutilisation des procdures aussi simple que possible : ce programme appelle 12 fois une procdure qui crit un message lcran et rend la main au DOS. Remarque : Les codes ASCII 10 et 13 reprsentent respectivement la fin de ligne et le retour chariot. Grce eux, on revient la ligne chaque fois quon a crit le message.
Djamal Rebane 21

Title les procdures Pile segment stack dw 100 dup (?) Basedepile equ thisword Pile ends data segement message db bonjour, monde!, 10,13, $ data ends code segment assume cs:code, ds:code, ss:pile debut: MOV AX, data ; initialise le segment de donnes MOV DS, AX MOV AX, Pile MOV SS, AX ; initialise le segment de pile MOV SP, basedepile MOV CX,12 boucle: call ecritmessage LOOP boucle

; appel de procdure ; dcrementer CX dune unit et aller ; boucle si CX est diffrent de 0

; terminer le programme ici par le retour au DOS mov AX, 4C00h INT 21H Djamal Rebane 22

ecritmessage proc near ;notre procdure mov ah, 09h move dx,offset message int 21h ret ecritmessage endp ; fin de la procdure/fonction
code ends ; fin du segment de code end debut ; fin de la porte dentre

Djamal Rebane

23

Le passage de paramtres Une procdure effectue gnralement des actions sur des donnes qu'on lui fournit, toutefois dans la dclaration de la procdure il n'y a pas de paramtres (dans des langages volus on place gnralement les noms des variables comme paramtres entre des parenthses, spars par des virgules). Il existe toutefois deux faons de passer des paramtres une procdure: Le passage des paramtres par registre: on stocke les valeurs dans les registres utiliss dans la procdure Le passage des paramtres par pile: on stocke les valeurs dans la pile avant d'appeler la procdure, puis on lit le contenu de la pile dans la procdure. Le passage de paramtres par registres C'est une mthode simple pour passer des paramtres: Elle consiste crire une procdure en faisant rfrence des registres dans les instructions, et de mettre les valeurs que l'on dsire dans les registres juste avant lappel de la fonction...
Djamal Rebane 24

Le passage des paramtres par registre


Cette manire de procder est trs simple mettre en oeuvre mais elle est trs limit, car on ne peut pas passer autant de paramtres que l'on dsire, cause du nombre limit de registres. On lui prfrera le passage des paramtres par pile.

Le passage de paramtres par pile


Cette mthode de passage de paramtres consiste stocker les valeurs des paramtres dans la pile avant l'appel de procdure (grce l'instruction PUSH), puis de lire le contenu de la pile grce un registre spcial (BP: Base pointer) qui permet de lire des valeurs dans la pile sans les dpiler, ni modifier le pointeur de sommet de pile (SP).

Djamal Rebane

25

L'appel de la procdure se fera comme suit:

PUSH parametre1 ; o parametre1 correspond une valeur ou une adresse PUSH parametre2 ; o parametre1 correspond une valeur ou une adresse CALL procedure
La procdure commencera par l'instruction suivante: MOV BP, SP ;permet de faire pointer BP sur le sommet de la pile Puis pourra contenir des instructions du type:

MOV AX, [BP] ;Stocke la valeur contenue dans le sommet de ;la pile dans AX, sans dpiler MOV BX, [BP+2] ;Stocke la valeur contenue dans le mot suivant de la ;pile dans BX (un mot fait 2 octets), sans dpiler
Djamal Rebane 26

Exemple avec passage par registre


On va crire une procdure ``SOMME'' qui calcule la somme de 2 nombres naturels de 16 bits. Convenons que les entiers sont passs par les registres AX et BX, et que le rsultat sera plac dans le registre AX.

La procdure s'crit alors trs simplement :


Djamal Rebane 27

SOMME PROC near ; AX <- AX + BX ADD AX, BX RET SOMME ENDP

et son appel, par exemple pour ajouter 6 la variable Truc :


MOV AX, 6 MOV BX, Truc CALL SOMME MOV Truc, AX

Djamal Rebane

28

Exemple avec passage par la pile

Cette technique met en oeuvre un nouveau registre, BP (Base Pointer), qui permet de lire des valeurs sur la pile sans les dpiler ni modifier SP. Le registre BP permet un mode d'adressage indirect spcial, de la forme : MOV AX, [BP+6]; cette instruction charge le contenu du mot mmoire d'adresse BP+6 dans AX.

Ainsi, on lira le sommet de la pile avec : MOV BP, SP ;BP pointe sur le sommet MOV AX, [BP] ;lit sans dpiler et le mot suivant avec : MOV AX, [BP+2] ;2 car 2 octets par mot de pile.
L'appel de la procdure ``SOMME2'' avec passage par la pile est : PUSH 6 PUSH Truc CALL SOMME2
Djamal Rebane 29

passage de paramtres push AX push BX push CX push DX call soubroutine ; .........

; branchement vers la procdure Contineur traitement

soubroutine proc near mov BP,SP ; pointe vers le sommet de pile move AX, [BP+2] ; acqurir dernier paramtre (DX) sans dpiler; pourquoi? move AX, [BP+4] ; acqurir 3me paramtre (CX) sans dpiler move AX, [BP+6] ; acqurir 2me paramtre (BX) sans dpiler move AX, [BP+8] ; acqurir premeir paramtre (AX) sans dpiler ........... ret soubroutine ends
Djamal Rebane 30

Emplacement de sous-programmes En gnral, les sous-programmes sont mis la fin du programme principal. Mais, on peut aussi les mettre dans la partie du segment de code. Seulement,il faudra sassurer que la premire instruction de code excute soit celle du programme principal. Pour cela, il suffit juste de mettre un JMP juste avant la dclaration du sousprogramme.

Djamal Rebane

31

Exemple: le calcul de PGCD de plusieurs nombres


TITLE PGCDdeplusieursnombres SPILE SEGMENT STACK DW 100 DUP(?) SPILE ENDS SDATA SEGMENT valeurs DB 10,30,40,76,32,52 resultat DB 3 dup(?) tab_sortie db 7 dup('$') tab_conv db 7 dup('$') start dw 0 SDATA ENDS SCODE SEGMENT ASSUME CS:SCODE,DS:SDATA JMP debut PGCD proc near ; dclaration de la fonction repet: MOV AL,CL MOV AH,0 IDIV CH; CMP AH,0 JE dfin MOV CL, CH MOV CH, AH JMP repet dfin: RET ;le PGCD est dans CH PGCD ENDP ;fin de la procdure PGCD

Djamal Rebane

32

DEBUT: mov ax,sdata mov ds,ax mov SI,0; sert dindice tableau MOV BX, 5; compteur de nombre manipuler mov CH, valeurs[SI] INC SI repeter: CMP BX,0 JE fin mov CL, valeurs[SI] Call PGCD INC SI DEC BX JMP repeter Fin: ; le PGCD de tous les nombres est dans CH

Djamal Rebane

33

xor ax,ax ; tout ce qui suit sert afficher les chiffres contenus dans le PGCD qui est dans CH mov al,ch mov si, offset tab_conv mov start, offset tab_conv ;start sert garder le dbut du tableau mov bx,0 mov bl,10 division: ; on suppose que la division se fait sur des nombre de 16 bits div bl cmp al,0 je fin_div add ah,48 mov byte ptr[si],ah mov ah,0 inc si jmp division fin_div: add ah,48 mov byte ptr[si],ah ; tab_conv contient le nombre converti lenvers xor bx,bx mov bx, offset tab_sortie xor ax,ax

Djamal Rebane

34

st_bcl: cmp si,start jb fin_bcl mov ah , byte ptr[si] mov byte ptr[bx] , ah dec si inc bx jmp st_bcl fin_bcl: mov byte ptr[bx],10 inc bx mov byte ptr[bx],13 inc bx mov byte ptr[bx],'$' mov dx,offset tab_sortie mov ah,09h int 21h Sortie: MOV AX, 4c00h; Int 21h SCODE ENDS END DEBUT

Djamal Rebane

35

La rcursivit
Dfinition: Une procdure est dite rcursive si, et seulement si, elle fait appel elle-mme, soit directement soit indirectement

Djamal Rebane

36

Fonctionnement dune fonction rcursive


Cration dune pile pour la sauvegarde entre autres des paramtres dappels de la procdure et la ladresse de retour.

Djamal Rebane

37

Calculer le factoriel de n, not n! Le problme est: Calculer le factoriel d'un nombre entier donn en entre. En entre: Nous avons n nombre entiers qui sont plus grands ou gaux 0.

Sortie: Nous avons un nombre entier qui reprsente le factoriel de n.

Djamal Rebane

38

Fonction principale entier n nfact lire n si (n < 0) alors crire entre ngative: n sinon nfact factoriel(n) crire la factorielle de n est nfact

o factoriel satisfait le prototype entier factoriel(entier)


Djamal Rebane 39

Fonction factoriel int factoriel(entier n) { si (n < 1) retourner 1 retourner n * factoriel(n-1) }

Djamal Rebane

40

Comment le faire en assembleur?


On a besoin dune pile! En effet, chaque appel rcursif, la valeur du paramtre n est sauvegarde dans la pile de travail. Ce processus dempilement est rpt jusqu ce que le paramtre actuel (de lappel) n atteigne la valeur 0. Cela correspond la fin de lexcution de la fonction appelante. Ensuite, commence le dpilement, et lexcution de la prochaine instruction de la fonction appelante est entame. Ce processus de dpilement est rpt jusqu ce quon atteigne la valeur de dpart du paramtre n.

Djamal Rebane

41

Cela se traduit par le programme assembleur TITLE factoriel PILE segment stack dw 100 dup(?) Basdepile equ this word PILE ends Data segment N dw 4 fact dw ? Data ends Code segment assume CS:code, DS:Data, SS:Pile Debut: MOV AX,Data MOV DS,AX MOV AX,Pile MOV SS, AX ; initialise le segment de pile MOV SP, basdepile ; copier l'adresse de la base de la pile dans SP mov BX,n; sauvegarde la valeur de n mov AX,BX Push AX call factoriel
Fin: pop AX; le rsultat calcul par la fonction factoriel est dans AX mov fact, AX mov AX,4c00h int 21h Djamal Rebane

suivant

42

Factoriel proc near ; en utilisant la pile CMP AX,0 JA DEPILE MOV AX,1 JMP fin DEPILE: ; dpiler jusqu ce n = 0 DEC AX PUSH AX ; factoriel(n-1) CALL FACTORIAL RetourResultat: POP BX MUL BX fin: ret factoriel endp ; fin de la procdure code ends end debut ; fin du programme code

Djamal Rebane

43

Calcul dune somme par rcursivit


Title sommerecursive; pour totaliser la somme de 1 jusqu n.
PILE segment stack dw 100 dup(?) Basdepile equ this word PILE ends Data segment N dw 12 som dw ? Data ends Code segment assume CS:code, DS:Data, SS:Pile Debut: MOV AX,Data MOV DS,AX MOV AX,Pile MOV SS, AX ; initialise le segment de pile MOV SP, basdepile ; copier l'adresse de la base de la pile dans SP mov CX,n; sauvegarde la valeur de n XOR AX,AX CALL sommerecursive Fin: pop AX; le rsultat calcul par la fonction factoriel est dans AX mov fact, AX mov AX,4c00h int 21h

Djamal Rebane

44

sommerecursive proc near ; en utilisant des registres CMP CX,0 JZ fin ADD AX,CX DEC CX CALL sommerecursive fin: ret factoriel endp ; fin de la procdure code ends end debut ; fin du programme code
Djamal Rebane 45

Les nombres de Fibonacci


Question: crire un programme qui calcule le nombre de Fibonacci dfini comme suit:

Fn Fn1 Fn2 ; si n 1 F0 0; F1 1
Djamal Rebane 46

e m n

TITLE fibonacci SPILE SEGMENT STACK DW 100 DUP(?) SPILE ENDS SDATA SEGMENT n dw 6 SDATA ENDS SCODE SEGMENT ASSUME CS:SCODE,DS:SDATA DEBUT: mov ax,sdata mov ds,ax xor ax,ax xor bx,bx mov ax,n call fibo mov dl,al; afficher le rsultat add dl,30h mov ah,2 int 21h sortie: MOV AX,4C00H INT 21H

Djamal Rebane

47

Fibo proc si1: cmp ax, 1 ; comparer ax avec 1 ja els ; si n<= 1, retourner 1 mov ax, 1 ; mettre 1 dans ax ret els: dec ax ; dcrmenter ax de 1 c'est--dire gal n-1 push ax ; mettre n-1 sur la pile call Fibo ; rsultat dans ax pop bx ; rectifier la pile et bx = n-1 dec bx ; bx = n -2 push ax ; sauvegarder ax = Fibonacci(n-1) sur la pile mov ax,bx ; passe le n-1 ax pour excuter Fibonacci(n-2) call Fibo ; rsultat dans ax = Fibonacci(n-2) pop bx ; bx = Fibonacci(n-1) add ax, bx ; ax = Fibonacci(n-2) + Fibonacci(n-1) ret Fibo endp SCODE ENDS END DEBUT
Djamal Rebane 48

Les tours de Hano

http://www.multimania.com/fmaire/jeux/hanoi/hanoi.html http://members.aa.net/~wgf/Hanoi/Hanoi.html
Djamal Rebane 49

Description du problme: Montrez comment dplacer n disques de tailles distinctes d'une tige A vers une tige B en utilisant comme tampon une tige C. Initialement seule la tige A contient les n disques ordonns avec le plus petit sur le dessus. On ne doit dplacer qu'un seul disque la fois. Il est interdit de placer un disque sur un autre plus petit. Entre: Un entier n reprsentant le nombre de disques.

Sortie: Une srie d'instructions de la forme " dplacer i vers j" indiquant les dplacements ncessaires pour rsoudre le problme.
Djamal Rebane 50

Fonction principale entier n lire n hanoi(n,1,2,3)

o hanoi satisfait le prototype


hanoi(entier, entier, entier, entier)

Djamal Rebane

51

Supposons quon sache comment dplacer les (n-1) derniers disques de la tour 1 vers la tour 2, en utilisant la tour 3.
dplacer le disque restant de la tour 1 vers la tour 2

dplacer maintenant les (n-1) disques de la tour 3 vers la tour 2, en saidant de la tour 1.

Djamal Rebane

52

Fonction hanoi

Entte: hanoi(entier n, entier i, entier j, entier k) (Affiche les instructions pour dplacer n disques de la tige i vers la tige k) Corps: si (n > 0) { hanoi(n-1, i, k, j) crire "Dplacer i vers k); hanoi(n-1, j, i, k) }

Djamal Rebane

53

#include <iostream.h>
void hanoi (int,int,int,int) void hanoi(int n,int i,int j,int k){ if (n>0){ hanoi(n-1,i,k,j); cout <<dplacer le disque de haut de la tour<<i<< la tour <<k; hanoi(n-1,j,k,i); } main(){ int n; cin>>n; hanoi(n,1,2,3); }

Djamal Rebane

54

Cette fonction est revoir


Tours-de-Hanoi PROC NEAR; push bp mov eb,sp mov ax,[bp+4] add eax,0x4 mov dx,[ax] push dx call atoi add sp,0x4 push word 0x2 ; INITIALISER LA PILE dohanoi push word 0x1 ; dohanoi(n, to from, using) push word 0x3 push word ax call dohanoi add sp,16 mov sp,bp pop bp ret

Djamal Rebane

55

dohanoi: push mov mov cmp jle dec push push push push call add push push call add mov dec push push push push call add

bp bp,sp ax,[bp+4] ax,0x0 fini ax [bp+ 12] ; empiler le premier appel rcursif dword [ebp+16] dword [ebp+20] dword eax dohanoi esp,16 dword [ebp+16] ; a disk moved, so print it dword [ebp+12] DeplaceLe esp,8 eax,[ebp+8] eax dword [ebp+16] ; empiler le deuxime appel rcursif dword [ebp+20] dword [ebp+12] dword eax dohanoi esp,16

fini: mov pop ret deplaceLe:

esp,ebp ebp push mov push push push call add mov pop ret ebp ebp,esp dword [ebp+8] dword [ebp+12] dword movestr printf esp,0xc esp,ebp ebp

Tours-de-Hanoi ENDP

Djamal Rebane

57

Remarquons quil est possible de supprimer carrment lappel rcursif, en le simulant par des appels successifs la pile, travers les empilements et les dpilements. Reprenons le problme de la fonction factoriel.

Djamal Rebane

58

Cela se traduit par le programme assembleur suivant


TITLE factoriel PILE segment stack dw 100 dup(?) Basdepile equ this word PILE ends Data segment N dw 4 fact dw ? Data ends Code segment assume CS:code, DS:Data, SS:Pile Debut: MOV AX,Data MOV DS,AX MOV AX,Pile MOV SS, AX ; initialise le segment de pile MOV SP, basdepile ; copier l'adresse de la base de la pile dans SP mov BX,n; sauvegarde la valeur de n mov ax,bx call factoriel Fin: pop AX; le rsultat calcul par la fonction factoriel est dans AX mov fact, AX mov AX,4c00h int 21h Djamal Rebane 59

factoriel proc near push ax Continuer: CMP AX,1 JLE dpiler; dplier jusqu ce n = 1 dec AX push AX JMP continuer Depiler: POP AX POP CX mul CX Push AX CMP BX,CX Ja depiler ret factoriel endp ; fin de la procdure code ends end debut ; fin du programme code

Djamal Rebane

60

Inversion dune chaine de caractres


Donne: S une chaine de caractres Question: Afficher S dans le sens inverse

Djamal Rebane

61

Fonction principale ecrire introdroduire la chane: inverser

Djamal Rebane

62

La fonction inverser fonctionne comme suit: Tant que le caractre lu nest pas le point, continuer la lecture; Arriv au point, laffichage commence.

Djamal Rebane

63

Entte: inverser Corps: lire car; si car <> `.` inverser; afficher car;

Djamal Rebane

64

TITLE inverser affiche macro chaine ; mov dx,offset chaine ; mov ah, 09h ; int 21h endm PILE segment stack dw 100 dup(?) Basdepile equ this word PILE ends Data segment Chaine db introduire votre chaine, 10,13, $ Data ends Code segment assume CS:code, DS:Data, SS:Pile Debut: MOV AX,Data MOV DS,AX MOV AX,Pile MOV SS, AX ; initialise le segment de pile MOV SP, basdepile ; copier l'adresse de la base de la pile dans SP Affich chaine call inverserl Fin: mov AX,4c00h int 21h

Djamal Rebane

65

inverser Proc near Continuer: mov ah,1 ;lecture dun cacactre int 21h CMP AL,. JNE dpiler; dpiler jusqu ce AL = . CBW ; convertir le caractre en un mot ; ou alors faire mov AH,0 push AX JMP continuer Depiler: POP AX mov AH,2 int 21 JMP depiler

ret inverser; fin de la procdure


code ends; fin du programme principal end debut

Djamal Rebane

66

Rechercher llment C dans un tableau tri dans lordre croissant.

C?

..

milieu

Djamal Rebane

67

void recherche(C,L,u:entier; trouve:booleen) { trouve = faux; si (u <= L) et (non trouve) { milieu = (u - L + 1) div 2; si A[milieu] = C trouve = vrai; sinon si A[milieu] > C recherche(C,L,milieu-1); sinon recherche(C,milieu+1,u); } }

Djamal Rebane

68

TITLE dichotomique PILE segment stack dw 100 dup(?) Basdepile equ this word PILE ends Data segment tableau db 100 dup(?) Valeur db ? Data ends Code segment assume CS:code, DS:Data, SS:Pile Debut: MOV AX,Data MOV DS,AX MOV AX,Pile MOV SS, AX ; initialise le segment de pile MOV SP, basdepile ; copier l'adresse de la base de la pile dans SP mov dx,offset tableau mov ah,0ah; lecture partir du clavier dune chane de caractres ; qui se termine ds quon tape le retour chariot (touche entre) int 21h

Djamal Rebane

69

mov SI, offset tableau ADD SI,2 ; adresse du premier lment mov BX, tableau[si+1]; nombre dlments dec BX ; indice du dernier lment ADD BX, SI; adresse du dernier lment mov ah,1; introduire la valeur rechercher int 21h mov Valeur,AL XOR AX,AX call dichoto Fin: mov AX,4c00h int 21h Code ends end debut

Djamal Rebane

70

Dichoto proc near Continuer: CMP BX, SI JL fin ; continuer jusqu il ny ait plus dlment rechercher mov AX, BX SUB AX, SI INC AX DIV 2 MOV DI,AL; mettre la valeur du milieu du tableau dans DI CMP tableau[DI], Valeur JE trouve; la valeur est trouve JG Gauche; la valeur ne se trouve pas dans la partie droite MOV SI, DI INC SI JMP continuer trouve: ; on a trouv llment JMP Fin2 gauche: MOV BX,DI DEC BX JMP continuer Fin: ; on na pas trouv llment FIN2: ret code endp

Djamal Rebane

71