我试图在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!$"
答案 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
);这取了操作数的偏移量,可能更适合你想要的......