【问题标题】:Read Input without using io.h in assembly在汇编中不使用 io.h 读取输入
【发布时间】:2017-06-09 14:34:54
【问题描述】:

我正在使用 masm32 来学习编程 32 位汇编程序。我想知道如何在不使用 io.h 预定义宏和过程的情况下直接从输入中读取(如 16 位汇编、调用中断或类似的东西)?有可能吗?

谢谢

【问题讨论】:

  • 是的。您调用操作系统提供的 API。在 Windows 上,控制台 I/O 是通过调用 ReadConsoleWriteConsole 等函数来完成的。这些由 Windows SDK 标头 (windows.h) 和您链接到二进制文件的相关库提供。在 Windows 中,中断不用于此目的。
  • 谢谢你的回答,但我想从头开始写,可以吗?
  • 不,不可能从头开始写。

标签: assembly 32-bit masm32


【解决方案1】:

使用 DOS 等较旧的操作系统,您可以调用例如INT 16h 向 BIOS 请求按键。不幸的是,这在类似 NT 的 Windows 下是不可能的。出于多种原因(安全性和稳定性是最重要的),对 BIOS 中断的访问由 Windows 内核控制,因此仅限于常规应用程序。

换句话说,您必须通过 Windows 内核调用直接或间接地获取所有击键。没有其他办法。你调用操作系统,操作系统调用内核,内核调用 BIOS。

但无论如何,如果您仍想使用中断,则有一种可能性——其代价是变得比选择 MASM32 作为目标语言后更加依赖平台。

在 32 位 Windows 下,可以通过 INT 2Eh 访问来自 NTDLL 的许多 Windows API。问题是不同版本的 Windows(有时甚至是同一版本的不同构建)在 INT 2Eh 函数编号上有所不同。

在开始研究此主题之前,请三思是否需要这种级别的平台依赖性。

【讨论】:

  • API 不是设计为以这种方式调用的,这样做绝对没有用处。
  • @CodyGray 它确实起到了作用。例如,在恶意软件中,它可能有助于避免用户模式 ​​API 跟踪和导入表分析。
  • 嗯,太好了,正是我们需要的,编写恶意软件的方法。我不认为这“有用”。
  • @CodyGray 的目的不一定是好的,所以说 INT2E 没有目的是不正确的。此外,了解恶意软件相关的技巧并不等于使用它们来创建恶意软件。
  • 您已经回答了显然是初学者的问题,这是一种晦涩难懂的高级技术,我认为我们都同意不推荐用于一般用途,并且限制了甚至在此之外的相关性。所以,是的,默默无闻的安全并不是一个成功的策略,了解恶意软件技巧当然是有用的,但不适用于初学者,也不适用于一般软件开发。这让我回到了我最初的主张:我认为你的回答没有用,因为我认为指导介于可疑和积极有害之间。
猜你喜欢
  • 2013-11-02
  • 1970-01-01
  • 2021-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-03
  • 1970-01-01
相关资源
最近更新 更多