Variables sour ASM pour 8086

Signaler
Messages postés
5
Date d'inscription
mercredi 17 décembre 2003
Statut
Membre
Dernière intervention
26 mars 2004
-
Messages postés
540
Date d'inscription
dimanche 23 mars 2003
Statut
Membre
Dernière intervention
5 octobre 2007
-
Bonjour à tous,
Etudiant, je suis en train de m'exercer avec Emu8086, un émulateur (et assembleur, au passage) d'assembleur sour 8086. J'ai tenté de faire un petit 'hello world' mais il semblerait qu'il bloque sur la déclaration de variable. D'où ma question, les variables existaient-elles déjà sur les 8086?? Un exemple du même prg est fourni avec l'émulateur et pour ce faire, l'auteur écrit directement dans la mémoire video. Dois-je en conclure que l' interruption 21h est inconnue au bataillon ???
J'aimerais tester mon code avec un autre émulateur, qu'avez vous de bien à me proposer? j'ai essayé bochs mais je n'ai jamais réussi à l'utiliser, il s'arrêtait tout seul en indiquant une erreur à la ligne 1558 du fichier ROMBIOS.C alors que tout semblait parfaitement bien configuré.
NDLR: O/S Win XP

Voici mon bout de code, j'ai p-e tout simplement fait une erreur...

#make_COM#
ProgrammeAfficheMessage SEGMENT ; Début du segment de code
ORG 100h ; COM file is loaded at CS:0100h

Start: message DB 'Hello World','$'
MOV DX,OFFSET message
MOV AX,0900h
INT 21h
HLT

ProgrammeAfficheMessage ENDS
END

1 réponse

Messages postés
540
Date d'inscription
dimanche 23 mars 2003
Statut
Membre
Dernière intervention
5 octobre 2007
1
Les variables existait déjà certain puisque une variable n'est qu'un emplacement en mémoire or à l'époque du 8086, il y avait 1Mo.
Par contre, l'interruption 21h est celle du DOS et à cette époque DOS n'existait pas, c'était DR-DOS mais peut-être que l'émulateur a une image de l'interruption 21h

Ton programme a pour 2 erreur la fonction 9 requiert de passer ta chaine par le pointeur DS or ce n'est pas certain qu'il soit correctement initialisé
D'autres part tu mets ta chaine à l'offet 100h, là où le programme comence à s'exécuter, il va donc exécuter le code machine correspondant à ta chaine.
Le premier octet qu'il va exécuter est 48h soit DEC AX. En effet, ta chaine commence par le caractère 'H' de code ASCII 48h
Tu dois placer ta chaine en dehors du code à exécuter:
#make_COM#
ProgrammeAfficheMessage SEGMENT ; Début du segment de code
ORG 100h ; COM file is loaded at CS:0100h

Start:
MOV AX, CS
MOV DS, AX
MOV DX,OFFSET message
MOV AX,0900h
INT 21h
HLT

message DB 'Hello World','$'

ProgrammeAfficheMessage ENDS
END 


Core Breaker :)