【问题标题】:x64 assembly system calls to interrupts [closed]x64汇编系统对中断的调用[关闭]
【发布时间】:2018-04-20 20:32:56
【问题描述】:

8 位和 16 位程序集是否独立于操作系统,如何编写独立于操作系统的 x64 位程序集?

具体来说,我想跳过基于操作系统的系统调用并使用 int21h 之类的中断(或在 x64 程序集上使用中断的任何特殊特技)等 x64。在这个例子中是关于如何编写手动系统调用,但我不明白。是39h中断吗?

代码:

Manual_WPM proc

mov r10, rcx
mov eax, 39h   ; Syscall Index for WPM (This one is for Win8.1)
syscall
ret

Manual_WPM endp 

end

【问题讨论】:

  • 欢迎来到 SO。请查看此处了解如何改进您的问题(格式化、校对、提供代码等):stackoverflow.com/help/how-to-ask
  • TL:DR:没有跨操作系统的可移植 ABI 用于进行系统调用之类的操作,而且绝对没有任何绕过操作系统的东西。进程隔离的全部意义在于保护进程彼此之间,因此操作系统当然必须阻止它们做任何事情,而不是直接操作寄存器+内存,而不通过操作系统。

标签: assembly


【解决方案1】:

int 21h 完全依赖于操作系统。它为操作系统的处理程序编号 21(十六进制)的处理程序生成一个“软件中断”,这本质上是操作系统的一个陷阱。对于 DOS,处理程序 0x21 是 Function Dispatcher,它为调用者解释寄存器 AH 以指定要分派到哪个函数。

我的猜测是,这会在不同的操作系统(例如 Linux)上做完全不同的事情,但也许 Linux 保留了一些 DOS 约定。

这些基于操作系统的系统调用,所以我不确定你要做什么。例如,试图通过回避操作系统来访问硬件不太可能取得成果。

【讨论】:

  • 在我发布此答案后,问题发生了很大变化,因此现在可能看起来不合理。
  • “我的猜测是,这会在不同的操作系统(如 Linux)上做完全不同的事情”:32 位 Linux 出于同样的原因使用 int 0x80
  • 抱歉,这对 StackOverflow 来说太宽泛了。也许您会在 cmets 中得到一些指示,但一般来说,编写与操作系统无关的代码需要大量的设计工作和经验,除非您坚持使用移植到许多平台的语言和库。对于汇编代码,只要您远离操作系统调用,就可以做到这一点,例如,非常快速的数组算法或其他一些计算密集型问题。如果涉及到 I/O,你的机会不大。
  • BIOS 中断如int 10h / ah=whatever 是比DOS int 21h 更好的例子。但当然,它们仍然完全依赖于操作系统。 @BefikerBiresaw:只有像 DOS(不是多任务操作系统;每个进程都以内核权限运行)之类的东西才允许软件通过 BIOS 接口而不是仅通过操作系统来访问硬件。任何“真正的”操作系统都会安装自己的 IDT(中断描述符表),10h 的处理程序会将其视为错误/分段错误,就像 Linux、OS X 和 Windows 一样。
  • 只要你不需要操作系统的任何东西,你就可以编写独立于操作系统的代码。考虑到现代操作系统为您提供内存以及任何 I/O 和硬件访问,您仅限于在有限的内存量(可能主要使用堆栈区域)上运行的纯算法代码,并且无法获取输入或提供输出。如果您在 asm 中编写更大的应用程序(没有意义,但如果您这样做了),那么以一种将操作系统交互包装在少数函数中为其他“干净算法”提供支持的方式设计代码仍然是有意义的,所以您只需要将一小部分源代码移植到其他操作系统。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-16
  • 1970-01-01
  • 2010-12-18
  • 2016-09-02
  • 1970-01-01
  • 1970-01-01
  • 2018-10-01
相关资源
最近更新 更多