x86汇编语言 - 终止程序

3
我相信对大多数人来说这很琐碎,但我不太熟悉x86汇编语言。我只是在尝试自学。
我在windows上。无论我去哪里阅读,都被告知要使用INT 21返回操作系统。这会退出程序,但我收到一个错误,显示Unhandled exception at 0x003d1313 in Assignment1.exe: 0xC0000005: Access violation reading location 0xffffffff
谢谢!

2
进程是一个依赖于平台的概念。你关心哪个平台? - JosephH
我已经编辑了代码。请注意,x86!= x86_64。 - JosephH
@Johnny Whisman: "int 21" 是用于DOS的。 - paulsm4
@Johnny Whisman:现代操作系统(包括Windows、Linux和Mac)严格将“内核空间”与“用户空间”分离。 用户空间程序(如Assignment1.exe)通常不被允许运行“特权命令”(如“int 21”)。 DOS允许您“直接与硬件交互”;Windows则不允许。希望这可以帮到你... - paulsm4
1
@paulsm4:int 不是特权指令。 - ninjalj
3个回答

7
在Windows上,如果你使用正式的汇编器(例如MASM),你可以简单地调用以下内容:
.386 
.model flat, stdcall 
option casemap:none 
include \masm32\include\windows.inc 
include \masm32\include\kernel32.inc 
includelib \masm32\lib\kernel32.lib 
.data 
.code 
start: 
        invoke ExitProcess,0 
end start

如果你不使用任何汇编器,并想直接执行一段二进制代码,请执行以下操作:
push xxx
push -1
push 0
mov eax, yyy
mov edx, 7FFE0300
call dword ptr ds:[edx]

其中 xxx 是进程的退出代码,yyy 是 NtTerminateProcess 的系统调用号码(使用http://www.pediy.com/document/Windows_System_Call_Table/Windows_System_Call_Table.htm来确定适当操作系统的调用号码。对于 Windows 7,它是 0x172)。


2
请注意,后一种方法是相当hack-ish的方法。不能保证它在未来的Windows NT版本中仍能正常工作。如果您知道其位置,最好只使用Kernel32.dll的ExitProcess API。 - JosephH

4

3
如果您的栈是平衡的,退出程序的最简单方法是:
retn

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