Salut !
Alors tout d'abord petites conventions d'écriture en FASM (différences par rapport à TASM):
Quand tu définis une variable ("Var dw 08FCh" par exemple). Var est traité comme un label, c'est-à-dire que "mov dx, Var" mettra toujours l'adresse de la variable nommée Var dans DX, la valeur du labels on veut...
Les crochets eux signifient toujours un "déréférencement de pointeur" pour comparer avec les langages de haut niveau. Ce qu'il y a entre les crochets est une adresse et [adresse] est ce qui ce trouve à cette adresse. Ansi "mov dx, [Var]" mettra la valeur 08FCh dans DX.
C'est la difference fondamentale entre la syntaxe TASM-MASM et celle de FASM-NASM.
Donc dans ton cas, "mov dx, Message" mettra dans DX l'adresse du début de ta variable alors que "mov dx, [Message]" mettrait les deux premiers octets de ta chaîne dans DX (puisque DX est un mot, donc deux octets).
En fait tu doit passer par DS parce que la fonction du DOS se base sur DS. Elle doit être déclarée comme ça :
mov al, [ds:dx] ;ceci est possible
S'il y avait ça :
On devrait se baser sur ES.
Ce qu'il faut comprendre c'est que le DOS utilise l'adresse d'un segment (DS), plus un décalage (DX).
Il faut donc que DS dans ton programme pointe sur le bon segment, et que DX ait la bonne valeur de décalage par rapport à au segment pointé par DS. Une fois que tu auras assimilé ça ce sera bon.
Ton programme n'est composé que d'un seul segment ce qui simplifie grandement les chose pour toi. En effet dans un programmede ce type le DOS fait automatiquement pointer tous les registres de segment sur le même segment, ce qui veut dire que DS = ES = CS... Et il se trouve que ton assembleur calcule automatiquement toutes les adresses de tes variables et labels par rapport à ce même segment, tu n'as donc pas à t'occuper de la valeur de DS quand tu appelle l'Int du DOS :
Ceci suffit :
1 2 3
| mov ah, 09h
mov dx, Message
int 21h |
Tu peux mettre ça directement au début de ton programme.
Partager