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

时间:2011-06-11 21:38:36

标签: windows linux assembly

比如这个linux系统调用int $0x80

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

2 个答案:

答案 0 :(得分:1)

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

int 0x80是一种在Linux上调用系统调用的方法。就POSIX而言,它是一个实现细节,POSIX实际上是Linux和SUA的共同点。所以我会说虽然Linux(在x86上)确实支持0x80用于系统调用,但我认为没有理由在Windows上使用SUA。那是因为SUA不是一个包含与Linux兼容性的系统。如果你在Linux上构建一个程序,它可能会使用int 0x80,但如果你在SUA下构建它以实现进行系统调用的目标,你可能会发现它有很大的不同。

你想要完成什么?

答案 1 :(得分:0)

Windows具有类似于Linux的系统调用,以便从用户模式访问内核服务。通常,您不直接使用syscallint指令,而是使用ntdll.dll中的一个包装器。

Linux系统调用与Windows系统调用之间肯定没有任何1:1的相关性。

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