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.
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