assembly - 程序集如何访问 CPU 之外的东西,例如 HDD 或 RAM?

标签 assembly io x86 cpu-architecture

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

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

最佳答案

在 x86 汇编中,MOV 指令用于从 RAM 中获取数据并将其放入 CPU 的寄存器之一,您可以在其中进行操作。 MOV 指令也可以将数据写回 RAM。要在计算机上使用这些设备,那就是另一回事了。

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

关于assembly - 程序集如何访问 CPU 之外的东西,例如 HDD 或 RAM?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2613061/

相关文章:

c - 系统调用和中断的实现有何不同?

c# - File.WriteAllText 不将数据刷新到磁盘

c++ - 在 C++ 中进行基本 128 位整数计算的有效方法?

arrays - 采纳意见的最佳做法

c - 让 ASM 中的库在 C 中访问它?

c - 了解 C 及其对应的汇编语言

linux nasm 程序集打印从零到 100 的所有数字

assembly - 是否可以在不使用 `jump` 和 `goto` 的情况下在汇编中做出决定?

c - 缓冲区溢出跳转到禁用的功能

java - 创建一个 Jar 并向其中添加多个流