只是想知道,关于我的帖子内置宏的替代,是否可以通过使用 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
答案 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;终止。字符。
可是:
然后......是的,你不能用它来打印消息,不存在这样的事情:你必须调用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宏。