Windows系统调用

时间:2014-01-12 11:58:03

标签: windows assembly

我在Linux上使用系统调用(非常)基本了解汇编(我使用GNU汇编程序as)。 在Windows 7上,我使用GCC编译器套件的MinGW(32位)端口来生成汇编程序。在Linux上我经常使用C库在我的汇编程序中进行一些操作系统交互,在我的Windows平台上,使用MinGW也可以很好地工作。但是,有时我想使用低级系统调用 - 主要是为了使我的可执行文件尽可能小。在Linux上我知道如何做到这一点:

movl        $0, %ebx
movl        $1, %eax
int $0x80   ; exit with code 0

我还使用这些系统调用来读取/写入终端的字符(例如,在EAX中写入带有4的系统调用)。我想知道如何在Windows NT平台上执行此操作。可能吗?我查看了this table,但我并不完全理解系统调用的名称。欢迎任何帮助。

1 个答案:

答案 0 :(得分:10)

Nt*函数集没有文档记录:它是Windows的内部函数和版本之间的变化,这意味着直接针对它的程序在Windows版本之间存在破坏的高风险。

实际上,针对公开的,有文档记录的功能,并没有那么大的开销,并且如果您正确使用API​​,则Microsoft可以保证您的程序与未来版本的Windows一起使用。

因此,我不会为您提供您想要的答案。我强烈建议您使用公共控制台API:http://msdn.microsoft.com/en-us/library/windows/desktop/ms682073%28v=vs.85%29.aspx

更新

看来我的答案颇有争议(14票,9票)!截至2017年3月下旬,这个答案有4个赞成票,但有6个赞成票。我会捍卫自己的立场,说OP没有说清楚这是为了实验还是有趣,实际上他写道:

  

但是,有时我想使用低级系统调用 - 主要是为了让我的可执行文件尽可能小。

...我发现这种推理方式存在问题,我不想充当这些开发实践的推动者,特别是因为使用系统调用来实现控制台任务没有实际好处。我是不是直接回答这个问题而直接回答这个问题,而我对“串联SQL”问题的答案也没有给OP他们想要的东西,但是告诉他们使用参数化并且非常强烈地投票?

如果有人想知道如何在Windows中使用低级系统调用,那么请发布一个新问题,合适的框架,我很乐意回答。