我正在使用带有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.
使用以下快速和脏的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()
时才会发生这种情况。
答案 0 :(得分:1)
我注意到ret
可以用来结束程序,但据我所知,微软无法保证这一点。
结束计划的官方方式是致电exit()
或ExitProcess()
。
(在C中,编译器必须安排代码,使其等同于调用exit()
。
此外,我怀疑许多现有程序使用ret
而不是微软似乎不太可能改变这种行为。)
关于您的问题,SDL在您的程序被调用之前会做一些黑魔法:http://www.libsdl.org/faq.php?action=listentries&category=4#48
我建议您使用常见问题解答中建议的main()
入口点。
答案 1 :(得分:0)
当然,优雅的退出始终是首选方式,因此从技术上讲,exit()调用是正确的答案,但不是因为您提供的理由。 (即:因为微软这么说)
在Linux,DOS和其他操作系统上,退出只是一个带有某些参数的中断调用,通常在不希望用libc链接你的程序时使用。(例如,如果您正在编写在内核或其他操作系统中运行的内容)
另外,像freepascal这样的其他编译器(完全可以理解)不依赖于libc,编译器只会生成相应的中断调用。