使用Win32上的FASM在SDL上重新启动

时间:2010-03-31 12:01:12

标签: windows assembly return sdl fasm

我正在使用带有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()时才会发生这种情况。

2 个答案:

答案 0 :(得分:1)

我注意到ret可以用来结束程序,但据我所知,微软无法保证这一点。 结束计划的官方方式是致电exit()ExitProcess()

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

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

答案 1 :(得分:0)

对于Bastien来说:关于ret和微软没有多大意义,如果你看一下源代码这是一个ELF二进制文件,它与微软有关的东西没有任何关系。

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

在Linux,DOS和其他操作系统上,退出只是一个带有某些参数的中断调用,通常在不希望用libc链接你的程序时使用。

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

另外,像freepascal这样的其他编译器(完全可以理解)不依赖于libc,编译器只会生成相应的中断调用。