如何在Windows系统的x86汇编语言中编写一个系统调用?

4

我需要在针对Windows平台的x86汇编代码中执行系统调用(syscall)。

在Linux上,我只需执行像int 0x80这样的操作,但在Windows上无法使用此方法。如何实现在Windows上进行系统调用的功能?

(如果有影响的话,我使用AT&T语法和编写64位代码,但答案对于Intel语法和32位代码应该是相同的。)


2
你会想要调用WinAPI函数调用,而不是直接进行系统调用。 - Michael Petch
2
我很难相信我们还没有一个类似的问题,但我找不到这个问题的重复目标。它经常被问到,所以也许我们应该考虑把这个问题变成一个规范问题?有没有比我更熟悉x86标签的人知道我错过了哪个问题?我确实找到了这个这个,但它们太专注于NT本地(未记录)API,这与将*NIX系统调用转换为Windows的基本问题无关。 - Cody Gray
3
顺便说一句,在Linux上使用64位代码时,应该通过syscall使用64位ABI,而不是通过int $0x80使用32位ABI,因为它会破坏r8-r15寄存器,将指针截断为32位,并使用任何结构体的32位版本。有关调用约定和syscall的系统调用号,请参阅x86标签wiki中的链接。 (即查看unistd_64.h) - Peter Cordes
1个回答

0

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

13
"although assembly on Windows is nonsense" 这句话的意思是“虽然在Windows上进行汇编是荒谬的”。 - Cody Gray

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接