1

我将 SDL 与 FASM 一起使用,并且代码至少类似于以下内容:

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.

使用以下快速而肮脏的makefile:

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())似乎是让该程序干净退出的唯一方法,即使我觉得我应该能够使用retn/ retf。当我ret没有调用exit()时,应用程序不会终止并且需要被杀死。任何人都可以对此有所了解吗?只有当我调用SDL_SetVideoMode().

4

2 回答 2

1

我注意到这ret可以结束程序,但据我所知,微软在任何地方都不能保证。结束程序的正式方法是调用exit()ExitProcess()

(在 C 语言中,编译器必须安排代码,使其等效于调用exit()。此外,我怀疑很多现有程序都使用ret它,微软似乎不太可能改变这种行为。)

关于您的问题,SDL 在调用您的程序之前做了一些黑魔法:http ://www.libsdl.org/faq.php?action=listentries&category=4#48 。
我建议您main()按照常见问题解答中的建议使用入口点。

于 2010-04-01T07:11:53.870 回答
0

对 Bastien:关于 ret 和 Microsoft 的内容没有多大意义,如果您查看源代码,这是一个 ELF 二进制文件,它与任何与 Microsoft 相关的东西都没有关系。

当然,优雅的退出始终是首选方式,因此从技术上讲,exit() 调用是正确的答案,但不是因为您提供的理由。(即:因为微软这么说)

在linux、DOS等操作系统上,exit只是一个带有某些参数的中断调用,通常在不想将程序与libc链接时使用。

(例如,如果您正在编写在内核或其他操作系统中运行的东西)

此外,其他编译器如 freepascal(很容易理解)不依赖于 libc,编译器只会生成适当的中断调用。

于 2010-05-12T03:27:17.807 回答