我对在Linux上使用系统调用进行汇编有一个(非常)基本的了解(我使用的是GNU汇编程序as
)。在Windows7上,我使用的是GCC编译器套件的MinGW (32位)端口来生成汇编程序。在Linux上,我经常在我的汇编程序中使用C库进行一些操作系统交互,而在我的Windows平台上,使用MinGW也能很好地工作。但是,有时我希望使用低级系统调用--主要是为了使我的可执行文件尽可能小。在Linux上我知道如何做到这一点:
movl $0, %ebx
movl $1, %eax
int $0x80 ; exit with code 0
我还使用这些系统调用从终端读取/写入字符(例如,在EAX中使用4写入syscall )。我想知道如何在Windows NT平台上做到这一点。有可能吗?我查看了this table,但我并不真正理解syscall的名称。欢迎任何帮助。
发布于 2014-01-12 20:10:49
Nt*
的函数集是没有文档的,这是有充分理由的:它是Windows的内部函数,并且在不同版本之间会发生变化,这意味着直接针对它的程序在不同版本之间崩溃的风险很高。
实际上,以公共的、有文档记录的函数为目标的开销并不大,只要您正确使用API,您就可以得到Microsoft的保证,即您的程序将在未来的Windows版本中运行。
因此,我不会为您提供您想要的答案。我强烈建议您使用公共控制台API:http://msdn.microsoft.com/en-us/library/windows/desktop/ms682073%28v=vs.85%29.aspx
更新
我假设这是为了实验或有趣,事实上,OP写道:
然而,
有时,我希望使用低级系统调用--主要是为了使我的可执行文件尽可能小。
...I发现这种推理方式有问题,我不想充当此类开发实践的推动者,特别是在使用syscall执行控制台任务没有实际好处的情况下。
如果有人想知道如何在Windows中使用低级系统调用,那么请发布一个新的问题,适当的框架,我将很乐意回答它。
但作为起点,请参阅https://j00ru.vexillium.org/syscalls/nt/64/以获取按x64内核版本分解的Windows系统调用号的反向工程表。(不要在可移植代码中使用,仅用于实验,以满足您对Windows和/或asm如何工作的好奇心。)
https://stackoverflow.com/questions/21074334
复制相似问题