1

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

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

4 回答 4

5

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

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

于 2010-04-10T10:45:13.427 回答
3

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

于 2010-04-10T10:44:35.430 回答
1

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

另一件事是从您的汇编代码中调用 C 库

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

于 2010-04-10T10:48:05.767 回答
0

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

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

于 2010-04-10T10:44:24.590 回答