Afficher un nombre

Signaler
Messages postés
289
Date d'inscription
dimanche 10 août 2003
Statut
Membre
Dernière intervention
28 février 2009
-
Messages postés
540
Date d'inscription
dimanche 23 mars 2003
Statut
Membre
Dernière intervention
5 octobre 2007
-
Bonjours, je voudrais afficher un nombre mais j'ai toujours des erreur :

J'ai donc 2 questions :

Comment déclarer une variable qui contiendra des nombre ( integer ) (
j'ai essayé : var db 100 dup (?) - mais je suis pas sûr de ce que sa
fais XD )



Comment afficher ces nombre ( l'interruption 21h avec AH=09h ne fonctionne pas ... )



Il faut peut etre ajouté un '$' à la fi de ma chaine pour qu'elle soit destiné à l'affichage, mais comment ?



Merci d'avance



PS : J'ai commencé l'assembleur hier ... Soyez sympa ;-)
-=Ar$£nik=-

4 réponses

Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Les nombres sont codé en binaire, tu veux les afficher en base 10, il
faut donc que tu fasses des divisions successives par 10 de ton nombre.
Pour la déclaration, il suffit de faire var dw ? par exemple.
Messages postés
289
Date d'inscription
dimanche 10 août 2003
Statut
Membre
Dernière intervention
28 février 2009
2
Euh ... tu pourrait t'expliquer ? :p

Par exemple ( sachant que je code sous TASM ) pourait tu me donner la source d'une prog qui affiche :



Test1

Test2

Test3



Sa me permeterai d'apprendre la gestion des nombre et de la concaténation...

Merci !


-=Ar$£nik=-
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
1
salut,

un tableau d'int c'est pour le C, en asm c'est pas le compilateur qui gère les flags, la taille d'un int du C dépends si tu prog en 16 ou 32 bits.

db = char ou byte ( 8 bits )
dw = int ou word ( 16 bits )
dd = int ou dword ( 32 bits )

si tu prog en 16 bits:
var word 100 dup (?)

si tu prog en 32 bits:

var dword 100 dup (?)

ensuite:
.data
fmtDD db "%d",0
.data?
tvar dword 100 dup (?)
.code
start:
sub esp,128
mov edi,100
lea si,[tvar]

@@:
mov ecx,esp
invoke wsprintf,ecx,OFFSET fmtDD,DWORD PTR[esi]
mov ecx,esp
invoke MessageBox,0,ecx,0,MB_OK
dec edi
lea esi,[esi+4]
jne @B

add esp,128
invoke ExitProcess,0

end start

@++
Messages postés
540
Date d'inscription
dimanche 23 mars 2003
Statut
Membre
Dernière intervention
5 octobre 2007
1
db 100 dup(?) ; réserve 100 octets non initialisés
dw 10 dup (1234h) ; réserve 10 word (donc 20 octets) avec pour chacun des word la valeur 1234h
donc en mémoire tu auras 3412341234123412341234123412341234123412
c'est 3412 et pas 1234 car en mémoire la position des octets est inversée

un entier doit être convertit en chaine de caractères pour pouvoir être affichée avec la fonction 9 de l'int 21h, chaine qui doit effectivement se terminer par le caractère '$'

data segment word
un_int_a_afficher dw 12345
chaine db 5 dup(' '), '$' ; 5 car valeur max pour un word est 65535 (5 char max)
data ends

pile segment word
dw 100h dup(?)
pile ends

code segment word public use16
assume cs:code,ds:data,es:data,ss:pile
debut:
mov ax, data
mov ds, ax
mov es, ax

mov di, offset chaine + 4 ; on se place juste avant le $
; pour placer les chiffres de droite à gauche

mov ax, word ptr [un_int_a_afficher] ; le dividende
mov bx, 10 ; le diviseur (base décimale)
mov cx, 5 ; 5 chiffres max
std ; commande à stosb de placer di sur le char suivant en le déplacant
; sur la gauche du précédent

boucle:
xor dx, dx ; le dividende est dx:ax, et comme on a pas besoin de dx,
; on met dx à zéro

div bx ; après la division ax=quotient et dx=reste
xchg ax, dx
add al, '0' ; on fait la conversion en caractère
stosb ; on place le caractère
xchg ax, dx

or ax, ax ; on teste si le quotient est nul, dans ce cas on sort de la boucle
loopne boucle

; maintenant on affiche le résultat
; on fait pointer ds:dx sur la chaine
mov dx, offset chaine
mov ah, 9
int 21h

; on termine le programme (fonction 4Ch) avec code retour 0
mov ax, 4C00h
int 21h
code ends

end debut

Core Breaker