2010-11-13 6 views
1

J'ai essayé d'écrire mon premier programme .exe sur FASM. Cela fonctionne bien quand j'utilise l'org 100h, mais je veux compiler le fichier .exe. Lorsque j'ai remplacé la première ligne par "format PE GUI 4.0" et essayé de le compiler, l'erreur est survenue: "valeur hors limites" (ligne: mov dx, msg).FASM Programme HelloWorld .exe

ORG 100h  ;format PE GUI 4.0 

mov dx,msg 
mov ah,9h 
int 21h 

mov ah,10h 
int 16h 

int 21h 

msg db "Hello World!$" 

Comment changer le code source?
----------------------------------------------
la réponse est:

format mz 
org 100h 

mov edx,msg 
mov ah,9h 
int 21h 

mov ah,10h 
int 16h 

mov ax,$4c01 
int 21h 

msg db "Hello World!$" 
+0

Je ne suis pas un expert en matière de fims, mais avez-vous essayé 'movb'? –

+0

Il a dit: instruction illégale – purum

Répondre

4

Votre première version est au format COM. C'est un modèle FLAT en mode réel 16 bits. Votre deuxième version est au format DOS MZ. C'est un mode SEGMENTÉ en mode réel 16 bits.

Le modèle segmenté utilise des «segments» pour décrire votre DS (segment) et DX (décalage). Vous devez d'abord définir des segments pour vos données et votre code, et ensuite vous devez pointer correctement votre segment de données et votre décalage avant de pouvoir utiliser l'int 21h, fonction 9.

int 21h, fonction 9 a besoin d'un DS: DX pour être correctement configuré dans le modèle segmenté, pour imprimer une valeur nulle chaîne terminée

format MZ 
entry .code:start 
segment .code 
start: 
mov ax, .data ; put data segment into ax 
mov ds, ax ; there, I setup the DS for you 
mov dx, msg ; now I give you the offset in DX. DS:DX now completed. 
mov ah, 9h 
int 21h 
mov ah, 4ch 
int 21h 
segment .data 
msg db 'Hello World', '$' 

Hope this helps quelques FASM débutants là-bas.

+0

Une chaîne $ -terminée, je dirais? –

-1

Vous pouvez essayer d'utiliser à la place lea (c.-à-lea dx, msg); cela prend le décalage de l'opérande, et peut être mieux adapté à ce que vous voulez ...

+0

hmm, 'lea' est un opérande invalide ... – purum

+0

Qu'avez-vous écrit? lea devrait être choisi comme instruction et non comme opérande ... –

+0

Est-ce que FASM supporte le style MASM/TASM "mov dx, offset msg"? Sauf si vous avez besoin d'une fonctionnalité spéciale de Lea, il est préférable de l'éviter. C'est plus lent sur les processeurs plus anciens (je crois que tous les nouveaux ont du matériel supplémentaire pour le rendre rapide cependant). –

2

Si vous voulez DOS exe, vous avez besoin format mz.

+0

merci! format mz m'aider à compiler le programme, mais la sortie est: "[beaucoup de caractères étranges] Bonjour tout le monde!". Il semble que l'adresse de msg n'est pas correcte – purum

+1

Ce n'est pas correct si vous avez gardé l'org 100h. –

+0

si le début du fichier est: format mz org 100h mov dx, msg ... Je reçois un crash NTVDM.exe. Si le début du fichier est: format mz mov dx, msg ... J'ai une sortie incorrecte. – purum

Questions connexes