2010-11-13 62 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