2010-11-13 77 views
1

我试图在FASM上编写我的第一个.exe程序。当我使用org 100h时它工作正常,但我想编译.exe文件。当我用“格式PE GUI 4.0”替换第一行并尝试编译时,出现错误:“值超出范围”(行:mov dx,msg)。FASM 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!$" 

我该如何更改源代码?
----------------------------------------------
答案是:

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

我不是fasm的专家,但你试过'movb'吗? – 2010-11-13 20:41:15

+0

它说:非法指令 – purum 2010-11-13 20:43:33

回答

4

您的第一个版本是COM格式。它是一个16位实模式FLAT模型。 你的第二个版本是DOS MZ格式。它是一个16位实模式的SEGMENTED模型。

分段模型使用“段”来描述您的DS(段)和DX(偏移量)。所以首先你需要为你的数据和代码定义段,其次你需要正确指出你的数据段和你的偏移量是什么,然后才能使用int 21h函数9.

int 21h,function正确DX是建立在细分模型,打印一个空结束的字符串

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', '$' 

希望这有助于一些FASM新手在那里:9需要一个DS。

+0

A $ - 终止的字符串,我会说? – 2014-10-19 01:30:18

-1

您可能需要使用lea而尝试(即lea dx, msg);这需要操作数的偏移量,并可能更适合你想要的东西...

+0

嗯,'lea'是无效操作数... – purum 2010-11-14 12:04:54

+0

你写了什么? lea应该作为指令而不是操作数被拾取...... – 2010-11-14 22:12:51

+0

FASM是否支持MASM/TASM“mov dx,offset msg”风格?除非你需要lea的特殊功能,否则最好避免它。在较旧的处理器上它速度较慢(我相信所有新的硬件都有额外的硬件来让它变得更快)。 – 2010-11-24 15:39:59

2

如果你想要DOS exe,你需要格式mz

+0

谢谢!格式mz帮助我编译程序,但输出结果是:“[很多奇怪的字符] Hello World!”。看起来像味精的地址是不正确的 – purum 2010-11-14 12:06:18

+1

如果你保持组织100h是不正确的。 – 2010-11-14 12:33:39

+0

如果文件的开头是:format mz org 100h mov dx,msg ...我得到一个NTVDM.exe崩溃。如果文件的beginnig是:格式mz mov dx,msg ...我得到一个不正确的输出。 – purum 2010-11-14 13:03:33