【发布时间】:2014-01-31 04:45:11
【问题描述】:
我对在 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,但我不太了解系统调用的名称。欢迎任何帮助。
【问题讨论】:
-
内联系统调用而不是
call库包装函数通常不会节省太多代码大小,特别是如果您缺少 well-known optimizations likexor %ebx,%ebx而不是mov $0, %ebx。此外,Linux 上的int 0x80是调用 32 位 ABI 的缓慢传统方式。推荐的方法是调用 VDSO,以便它可以使用sysenter以获得更好的性能。 blog.packagecloud.io/eng/2016/04/05/… -
您可以将 0 和 1 放入 6 个字节的 2 个寄存器中,而不是像
xor ebx, ebx; lea eax, [ebx + 1]那样的 10 个字节。或xor eax, eax; cdq; inc edx仅花费 4 个字节(x86_64 中为 5 个)