FASM HelloWorld .exe程序

时间:2010-11-13 20:34:59

标签: assembly exe fasm

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

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!$" 

3 个答案:

答案 0 :(得分:4)

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

分段模型使用“细分”来描述您的DS(细分)和DX(偏移)。首先,您需要为数据和代码定义段,其次,您需要在使用int 21h,函数9之前正确指出数据段的位置和偏移量。

int 21h,函数9需要在分段模型中正确设置DS: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新手。

答案 1 :(得分:2)

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

答案 2 :(得分:-1)

您可能想尝试使用lea代替(lea dx, msg);这取了操作数的偏移量,可能更适合你想要的......