x86程序集(masm32) - 我可以在windows xp上使用int 21h来打印东西吗?

时间:2012-05-14 12:47:35

标签: winapi assembly x86 masm masm32

只是想知道,关于我的帖子内置宏的替代,是否可以通过使用 int 21h <来避免使用 StdOut 宏/ strong> windows API?如:

.data
       msg dd 'This will be displayed'
;original macro usage:
invoke StdOut, addr msg
;what I want to know will work
push msg 
int 21h ; If this does what I think it does, it should print msg

是否存在这样的事情(如使用int 21h打印东西),或者存在类似的东西,但不完全是21h。或者我完全错了。

有人可以为我澄清一下吗?

谢谢,

Progrmr

3 个答案:

答案 0 :(得分:7)

中断21h是 MS-DOS 功能的入口点。

例如,要在stdout上打印一些东西,你必须:

mov ah, 09h  ; Required ms-dos function
mov dx, msg  ; Address of the text to print
int 21h      ; Call the MS-DOS API entry-point

字符串必须以&#39; $&#39;终止。字符。

可是:

  • 您无法在Windows桌面应用程序中使用中断(它们仅适用于设备驱动程序)。
  • 如果需要调用MS-DOS函数,则必须编写 16位应用程序。

然后......是的,你不能用它来打印消息,不存在这样的事情:你必须调用OS函数来打印你的消息,并且它们不能通过中断获得。

答案 1 :(得分:2)

其他答案说你不能在Windows中使用中断是非常错误的。如果真的想要,你可以(不推荐)。至少在32位x86 Windows上有基于遗留int 2Eh的系统调用接口。参见例如this page对x86和x86_64 Windows上的系统调用机制进行了一些讨论。

这是一个程序的一个非常简单的例子(使用FASM编译),它在Windows 7上使用int 0x2e立即退出(并在大多数其他版本上崩溃):

format PE
NtTerminateProcess_Wind7=0x172
entry $
    ; First call terminates all threads except caller thread, see for details:
    ; http://www.rohitab.com/discuss/topic/41523-windows-process-termination/
    mov eax, NtTerminateProcess_Wind7
    mov edx, terminateParams
    int 0x2e
    ; Second call terminates current process
    mov eax, NtTerminateProcess_Wind7
    mov edx, terminateParams
    int 0x2e
    ud2    ; crash if we failed to terminate
terminateParams:
    dd 0, 0 ; processHandle, exitStatus

请注意,这是一种不受支持的使用Windows的方式:系统调用号码经常变化,通常不能依赖。在this page,您可以看到,例如Windows XP上的NtCreateFile调用系统调用号0x25,而在Windows Server 2003上,此号码对应NtCreateEvent,而在Vista上则为NtAlpcRevokeSecurityContext

支持(尽管记录不多)进行系统调用的方法是通过Native API库的功能ntdll.dll

但即使你使用Native API,“打印东西”仍然非常依赖于版本。也就是说,如果您有重定向到文件,则必须使用NtWriteFile,但在写入真正的控制台窗口时,您have to use LPC,目标进程取决于Windows版本。

答案 2 :(得分:0)

在Windows上无法在保护模式下使用中断。 您可以使用WriteFile api写入控制台,或使用MASM宏。