Windows上的Unix应用子系统如何在程序集中实现系统调用?如

问题描述:

比如这个linux系统调用int $0x80Windows上的Unix应用子系统如何在程序集中实现系统调用?如

SUA是否实施类似的东西? 如果是这样,那么命令是什么?

这个特殊的代码是一个我想改变对SUA

#cpuid.s Sample program to extract the processor Vendor ID 
.section .data 
output: 
    .ascii "The processor Vendor ID is 'xxxxxxxxxxxxx'\n" 
.section .text 
.globl _start 
_start: 
    movl $0, %eax 
    cpuid 
    movl $output, %edi 
    movl %ebx, 28(%edi) 
    movl %edx, 32(%edi) 
    movl %ecx, 36(%edi) 
    movl $4, %eax 
    movl $1, %ebx 
    movl $output, %ecx 
    movl $42, %edx 
    int $0x80 
    movl $1, %eax 
    movl $0, %ebx 
    int $0x80 

使用它在Unix上运行Linux的子系统,而不是整个计算机。

int 0x80是一种在Linux上调用系统调用的方法。就POSIX而言,这是一个实现细节,POSIX实际上是Linux和SUA的共同之处。所以我会说,虽然Linux(x86上)确实支持0x80的系统调用,但我没有看到为什么Windows上需要SUA。这是因为SUA不是一个包含与Linux兼容的系统。如果你在Linux上构建一个程序,它可能会使用int 0x80,但如果你在SUA下构建它以达到进行系统调用的目的,你可能会发现它完全不同。

你想完成什么?

+0

我想在组件上用屏幕打印一行。因为我刚刚开始学习装配。在linux上,我可以通过$ 0x80来实现,有没有办法在SUA上做类似的事情?或DOS程序集? – 2011-06-12 01:53:44

+0

你不是真的只用$ 0x80来做它,你也设置了一些系统调用参数,对吧?我想你需要弄清楚如何在Windows上装配系统调用。你在Linux上使用哪种系统调用? – 2011-06-12 01:57:14

+0

很酷。为您的ASM添加实质性评论也会有所帮助。另一个探索的想法是将其提升到一个水平,并谈论你实际想要完成的事情。也许它可以在没有ASM的情况下完成。 – 2011-06-12 02:14:07

为了从用户模式访问内核服务,Windows确实有系统调用,类似于linux。通常情况下,您不直接使用syscallint指令,而是使用ntdll.dll中的一个包装器。

linux系统调用和windows系统调用之间肯定没有任何1:1的相关性。

各种子系统(Win32,例如kernel32.dll和user32.dll和POSIX,例如SUA库)在需要进行系统调用时调用ntdll.dll函数。