【问题标题】:How can assembly access things outside the CPU, like the HDD or RAM?程序集如何访问 CPU 之外的东西,例如 HDD 或 RAM?
【发布时间】:2010-04-10 10:39:24
【问题描述】:

所以我看了一下x86汇编语言;所有命令都很清楚,但是:我看不到任何可以在计算机中实际触发的东西,例如:访问 RAM 而不仅仅是 CPU 寄存器、从 HDD 读取等。

  • 如何使用汇编程序超越 CPU 中的计算?

【问题讨论】:

    标签: assembly io x86 cpu-architecture


    【解决方案1】:

    在 x86 汇编中,MOV 指令用于从 RAM 中获取数据并将其放入 CPU 的一个寄存器中,您可以在其中对其进行操作。 MOV 指令也可以将数据写回 RAM。要在电脑上使用这些设备,那就另当别论了。

    设备使用所谓的中断,即设备需要您(CPU)注意时触发的事件。在您的代码中,您注册您的函数以在它触发时处理中断。要从设备获取数据或从设备获取数据,您可以使用IN 和OUT 指令,它们通过数据总线移动数据。这样,您可以向设备提供指令,例如:从硬盘扇区 X 到 Y 获取数据。然后硬盘启动,获取一些数据并触发中断。您为该中断注册的代码必须处理它,获取数据并将其写入某个适当的 RAM 位置。大多数 CPU 和设备还支持 DMA (Direct Memory Access),您只需在 RAM 中指定设备必须写入其数据的位置,然后在不中断 CPU 的情况下执行此操作。只有在设备完成后,它才会引发中断,您的汇编代码才能做出相应的响应。

    【讨论】:

      【解决方案2】:

      通常,您读取/写入内存映射设备,或使用特殊 I/O 指令读取/写入 I/O 端口。内存映射设备是在 CPU 和实际硬件之间共享的内存 - 访问它会使硬件做一些事情。

      【讨论】:

      • 非常正确。但是,当我阅读 OP 时,我看到“我该怎么做?”请注意,大多数操作系统都会保护其设备寄存器,因此通常会防止用户代码直接接触它们,而是更喜欢操作系统内核代表用户代码读取和写入寄存器。
      【解决方案3】:

      您可以使用MOV等指令访问RAM。访问磁盘等的 API 取决于您使用的操作系统 - 在 Linux 上,查看System call 接口。在 Windows 上,请查看 this tutorial - 跳过介绍性内容。

      另一件事是call C libraries from your assembly code。

      您可能感兴趣的一个项目是一个用 16 位 ASM 编写的教育操作系统。它可以访问文件系统,还有更多 - MikeOS,但请注意,由于各种原因,大多数事情不适用于在现代操作系统下运行的程序。

      【讨论】:

        【解决方案4】:

        您为内存映射 IO 或 x86 的特殊 IO 空间(in、out)编写访问 RAM(mov 和其他内存操作数)的代码。

        艺术是知道在什么时候从什么地址写入/读取什么。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-08-08
          • 1970-01-01
          • 2012-07-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-04-27
          相关资源
          最近更新 更多