我需要在针对Windows平台的x86汇编代码中执行系统调用(syscall)。
在Linux上,我只需执行像int 0x80
这样的操作,但在Windows上无法使用此方法。如何实现在Windows上进行系统调用的功能?
(如果有影响的话,我使用AT&T语法和编写64位代码,但答案对于Intel语法和32位代码应该是相同的。)
我需要在针对Windows平台的x86汇编代码中执行系统调用(syscall)。
在Linux上,我只需执行像int 0x80
这样的操作,但在Windows上无法使用此方法。如何实现在Windows上进行系统调用的功能?
(如果有影响的话,我使用AT&T语法和编写64位代码,但答案对于Intel语法和32位代码应该是相同的。)
Windows不允许您像在DOS或Linux上使用中断一样使用中断。您需要调用WinAPI或C库。在32位操作系统上,您有NTVDM,这是DOS应用程序的虚拟机,允许您使用int 21h
。请注意,访问低级磁盘(使用这些中断)的程序可能会被标记为误报。这是在Windows上调用Windows函数而不使用中断的示例(尽管在Windows上使用汇编是无意义的):
global _main
extern _printf
section .text
_main:
push message
call _printf
add esp, 4
ret
message:
db 'Hello, World', 10, 0
syscall
使用64位ABI,而不是通过int $0x80
使用32位ABI,因为它会破坏r8-r15寄存器,将指针截断为32位,并使用任何结构体的32位版本。有关调用约定和syscall
的系统调用号,请参阅x86标签wiki中的链接。 (即查看unistd_64.h) - Peter Cordes