1

FASM で最初の .exe プログラムを作成しようとしました。org 100h を使用すると問題なく動作しますが、.exe ファイルをコンパイルしたいです。最初の行を「format PE GUI 4.0」に置き換えてコンパイルしようとすると、「value out of range」(行: 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!$" 
4

3 に答える 3

4

最初のバージョンはCOM形式です。16ビットリアルモードのFLATモデルです。2番目のバージョンはDOSMZ形式です。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初心者の助けになることを願っています。

于 2011-02-23T16:57:12.753 に答える
2

DOS exe が必要な場合は、format mzが必要です。

于 2010-11-14T05:01:17.233 に答える
-1

lea代わりに (つまりlea dx, msg);を使用してみてください。これはオペランドのオフセットを取り、あなたが望むものにより適しているかもしれません...

于 2010-11-13T21:30:37.927 に答える