我在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,但我并不完全理解系统调用的名称。欢迎任何帮助。
答案 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中使用低级系统调用,那么请发布一个新问题,合适的框架,我很乐意回答。