1

私は FASM で SDL を使用しており、最低限次のようなコードを持っています。

format ELF

extrn _SDL_Init
extrn _SDL_SetVideoMode
extrn _SDL_Quit
extrn _exit
SDL_INIT_VIDEO equ 0x00000020

section '.text'
public _SDL_main
_SDL_main:

    ccall   _SDL_Init, SDL_INIT_VIDEO
    ccall   _SDL_SetVideoMode, 640, 480, 32, 0
    ccall   _SDL_Quit
    ccall   _exit, 0 ; Success, or
    ret              ; failure.

次の簡単なメイクファイルを使用します。

SOURCES = main.asm
OBJECTS = main.o
TARGET = SDLASM.exe
FASM = C:\fasm\fasm.exe

release : $(OBJECTS)
    ld $(OBJECTS) -LC:/SDL/lib/ -lSDLmain -lSDL -LC:/MinGW/lib/ -lmingw32 -lcrtdll -o $(TARGET) --subsystem windows

cleanrelease :
    del $(OBJECTS)

%.o : %.asm
    $(FASM) $< $@

exit()(またはWindowsの)を使用することが、このプログラムを正常に終了させる唯一の方法のようですが、 /ExitProcess()を使用できるはずだと思います。を呼び出さないだけでは、アプリケーションは終了せず、強制終了する必要があります。誰かがこれに光を当てることができますか? に電話をかけたときにのみ発生します。retnretfretexit()SDL_SetVideoMode()

4

2 に答える 2

1

プログラムを終了するために機能することに気付きretましたが、私が知る限り、Microsoft によって保証されているわけではありません。exit()プログラムを終了する正式な方法は、またはを呼び出すことExitProcess()です。

(C では、コンパイラは を呼び出すのと同等になるようにコードを調整する必要があります。また、 Microsoft がその動作を変更する可能性は低いexit()ため、多くの既存のプログラムが代わりに使用していると思われます。)ret

あなたの問題について、SDL はあなたのプログラムが呼び出される前にいくつかの黒魔術を行います: http://www.libsdl.org/faq.php?action=listentries&category=4#48。FAQ で提案されているように、エントリ ポイント
を使用することをお勧めします。main()

于 2010-04-01T07:11:53.870 に答える
0

Bastien へ: ret と Microsoft について少し説明してもあまり意味がありません。ソースを見れば、これは ELF バイナリであり、Microsoft 関連のものとは何の関係もありません。

もちろん、適切な終了は常に推奨される方法であるため、技術的には exit() 呼び出しが正しい答えですが、提供する論理的根拠によるものではありません。(つまり、Microsoft がそう言っているため)

Linux、DOS、およびその他のオペレーティング システムでは、exit は特定のパラメーターを使用した単なる割り込み呼び出しであり、プログラムを libc とリンクさせたくない場合に通常使用されます。

(たとえば、カーネルまたは別のオペレーティング システムで実行されるものを作成している場合)

また、freepascal のような他のコンパイラ (当然のことながら) は libc に依存せず、コンパイラは適切な割り込み呼び出しを生成するだけです。

于 2010-05-12T03:27:17.807 に答える