Documente Academic
Documente Profesional
Documente Cultură
En arithmétique non signée sur 16 bits, comment s'écrivent les nombres 32768
et 65536 (donner le résultat en notation hexa) ?
Ecrire une procédure qui parmi deux entiers (passés en paramètres sur la
pile) renvoie le plus grand dans AX.
Ecrire une procédure qui dit si un nombre positif (passé dans AX) est
premier.
Ecrire un programme COM qui affiche les noms des fichiers et dossiers du
répertoire courant.
Ecrire un programme COM qui écrit à l'écran les 20 premiers nombres premiers.
Ecrire un programme EXE qui calcule la somme des n premiers entiers (n étant
une constante définie dans le programme avec DEF) et qui l'écrit à l'écran.
Faire une boucle (c’est-à-dire ne pas utiliser la formule de Pascal) !
Correction
- Le nombre -32768 est l’opposé de +32768 qui s’écrit : 8*16^3, soit 8000 en hexa.
Inversons les bits : 0 va devenir F et 8 va se transformer en 7 (car 8h = 1000b et 0111b = 7h). Ca donne donc 7FFF.
Ajoutons une unité : ça fait 8000.
Petite question à 8000 balles : -32768 s’écrit donc 8000 en hexa, tout comme le nombre 32768 !! Où est donc le problème ? ? ?
Réponse à 32768 balles : on travaille ici sur 16 bits donc tous les nombres ne sont pas représentables ! On peut seulement coder
les entiers allant de –32768 à +32767. Si on cherche à dépasser ces limites du côté positif, on va se retrouver avec un nombre
négatif (et vice versa) ! Ici, 8000h code bien le nombre –32768 mais le nombre +32768 n’est pas représentable sur 16 bits.
- Le nombre 32768 s’écrit 8000 (voir la question précédente). Remarque : ici nous sommes toujours sur 16 bits, mais en
arithmétique non signée. Les nombres représentables sont compris entre 0 et 65535.
- Le nombre 65536 n’est pas représentable sur 16 bits (car 65536 = 16^4 s’écrit en hexa : 10000 ce qui demande au moins 17
bits) !
pop bp bx ;restauration de BP et BX
popf ;restauration des flags
ret 4 ;dépiler paramètres et retour
max endp
→ Procédure qui dit si un nombre positif (passé dans AX) est premier
comment *
Procédure qui dit si un nombre positif est premier
Paramètres : AX = nombre à tester
Résultat : AX = 1 si le nombre est premier et 0 sinon
*
test_prem proc near
.386
pushf ;sauvegarde des flags
pusha ;sauvegarde des reg. généraux
push ds ;sauvegarde de DS
push cs ;mettre cs
pop ds ; dans ds
mov word ptr ds:[TPsto_nombre], ax ;stocker le nombre à tester
mov bx, 2 ;on va le diviser par 2
TPprochaine_div:
xor dx, dx ;mettre DX à 0 pour la division
div bx ;diviser DX:AX par BX
cmp dx, 0 ;pas de reste ?
je TPnon_premier ;non ? alors pas premier !
mov ax, TPsto_nombre ;restaurer le nombre dans AX
inc bx ;on va diviser par le suivant
cmp bx, ax ;si nouveau diviseur >= nombre
jae TPpremier ; alors le nombre est premier !
jmp TPprochaine_div ;sinon recommencer !
TPnon_premier:
pop ds ;restauration de DS
popa ;restauration des reg. généraux
popf ;restauration des flags
mov ax, 0 ;le nombre n'était pas premier
jmp TPfini
TPpremier:
pop ds ;restauration de DS
popa ;restauration des reg. généraux
popf ;restauration des flags
mov ax, 1 ;le nombre était premier ;-)
TPfini:
ret ;retour à l'appelant
pop dx ax ;restaurer AX et DX
endm
pop dx ax ;restaurer dx et ax
endm
→ Programme COM qui écrit à l'écran les noms des fichiers et dossiers du
répertoire courant
comment *
Programme qui écrit à l'écran les noms des fichiers et des
dossiers du répertoire courant (sans les fichiers cachés,...)
Paramètres : aucun
Remarque : la macro ligne utilisée dans ce programme n’a pas été
réécrite. Il vous suffit de la copier-coller !
*
code segment use16
assume cs:code, ds:code, es:code, ss:code
org 100h
.386
debut:
mov dx, offset masque ;masque de recherche
mov cx, dossiers ;attriburs de recherche
taille_nom:
push cx dx ;sauvegarder attrib et masque
mov cx, 13 ;taille max + 1 du nom
xor al, al ;car. recherché : 00 terminal
mov di, 80h+1Eh ;départ (cf structure DTA)
repne scasb ;chercher le 00 terminal
sub cx, 12 ;déduire la
neg cx ; longueur du nom du fichier
mov bp, cx ; et la ranger dans bp
concat_$:
mov byte ptr [80h + 1Eh + bp], '$' ;ajouter le caract. ‘$’
ecrire_nom:
mov ah, 9h ;écrire une chaîne
mov dx, 80h + 1Eh ;offset de la chaîne
int 21h ;zou !
ligne ;revenir à la ligne
suivant:
pop dx cx ;restaure masque et attrib
mov ah, 4fh ;pour trouver suivant
jmp chercher ;allons-y !
terminer:
ret ;rendre la main au système
code ends
end debut
debut:
mov bx, 0 ;on teste à partir de 0
mov cx, combien ;nombre de nombres à afficher
prochain:
mov ax, bx ;nombre à tester dans AX
call test_prem ;est-il premier ?
cmp ax, 0 ;tester : si non premier
je vers_prochain ; alors passer au prochain
mov ax, bx ;sinon restaurer nombre
ecrit_ent ;écrire nombre
vers_prochain:
jcxz fini ;tester si CX = 0
inc bx ;pour tester le suivant
jmp prochain ;on va le tester, ce suivant !
fini:
code ends
end debut
→ Programme EXE qui calcule la somme des n premiers entiers et qui l’écrit
à l'écran
comment *
Programme qui écrit à l'écran la somme des n premiers entiers
naturels (n étant une constante).
Paramètres : aucun
Remarque : la macro ecrit_ent utilisée dans ce programme n’a pas
été réécrite. Il vous suffit de la copier-coller !
*
code segment use16
assume cs:code, ds:code, ss: pile
org 100h
.386
debut:
xor ax, ax ;accumulateur = 0
mov cx, combien ;pour le LOOP
cmp cx, 0 ;cas part. : somme de 0 entiers
je fin_boucle ;dans ce cas on sort
encore:
add ax, cx ;sinon on ajoute CX
loop encore ;et on LOOPe
fin_boucle:
end debut