【问题标题】:x86 Assembly Language - Terminate Programx86 汇编语言 - 终止程序
【发布时间】:2011-11-10 19:48:27
【问题描述】:

我相信这对大多数人来说都是微不足道的,但我对 x86 汇编语言不是很熟悉。我只是想自学。

我在窗户里。在我阅读的任何地方,我都被告知使用INT 21 返回操作系统。这会退出程序,但我收到一条错误消息Unhandled exception at 0x003d1313 in Assignment1.exe: 0xC0000005: Access violation reading location 0xffffffff

谢谢!

【问题讨论】:

  • 进程是一个依赖于平台的概念。您关注哪个平台?
  • 我已经编辑了代码。注意 x86 != x86_64
  • @Johnny Whisman:“int 21”用于 DOS
  • @Johnny Whisman:现代操作系统(包括 Windows、Linux 和 Mac)将“内核空间”与“用户空间”严格分开。用户空间程序(如 Assignment1.exe)通常不允许运行“特权命令”(如“int 21”)。 DOS让你“直接与金属对话”;窗户没有。 '希望对您有所帮助...
  • @paulsm4: int 不是特权指令。

标签: x86 assembly


【解决方案1】:

在 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)

【讨论】:

  • 请注意,后一种方法是一种 hack-ish 方法。不能保证它适用于 Windows NT 的未来版本。如果您知道它的位置,最好只使用 Kernel32.dll 的 ExitProcess API。
【解决方案2】:

答案完全取决于您使用的操作系统:)

这是一个在 Linux 上使用“int 0x80”的示例:

movl $1, %eax
movl $0, %ebx
int $0x80

此 Wikipedia 链接为您提供更多选择:

http://en.wikipedia.org/wiki/Exit_%28operating_system%29

【讨论】:

    【解决方案3】:

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

    retn
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-05
      • 2016-03-06
      • 2023-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-05
      相关资源
      最近更新 更多