C - 从内存中读取和写入字节

标签 c function memory

我想要一个可以从内存读取字节的函数,另一个可以像这样写入:

void write_memory(uint32 segment, uint32 offset, char ch);
write_memory(0x750F, 0x00AE, 16);
int read_memory(uint32 segment, uint32 offset);
printf("%d", read_memory(0x750F, 0x00AE));

可能已经有一个函数可以实现此目的,但即使有,我也更有兴趣自己编写它,看看它是如何完成的,那么我将如何编写这个函数。 谢谢。

最佳答案

这不是“纯C”问题,因为C语言标准没有定义如何访问给定地址的物理、线性或虚拟内存。在许多或大多数环境中,操作系统永远不会让您直接访问物理内存,或者仅在您要求时才允许您访问物理内存。

例如,在具有帧缓冲区的 Linux 上,要访问帧缓冲区内存,您必须以写入模式打开帧缓冲区设备,mmap它来处理内存并从以下位置开始写入内存它被映射的地址。

在实模式或 v86 模式 DOS 下,您可以使用 FAR 指针直接访问视频内存。在 DPMI 保护模式下,DPMI 提供访问物理内存的方法。

以下是 Turbo/Borland C++、Microsoft C 和 DJGPP 的示例:

#include <dos.h>
...
#if defined(__TURBOC__)     
    *(unsigned char far*)MK_FP(0xa000, i) = c;
#elif defined(_MSC_VER)
    *(unsigned char far*)(0xa0000000ul + i) = c;
#elif defined(__DJGPP__) // program is running under DPMI
    dosmemput(&c, 1, 0xa0000 + i);
#endif

关于C - 从内存中读取和写入字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39186294/

相关文章:

python - 我什么时候应该使用 *args?

c - 如何使用以及何时在 C 中使用 memmove?

c++ - 指针可以指向4GB之后的地址吗?

c - 我应该在 C 中的 basename/dirname 之后释放 strdup 指针吗?

C++ 重载运算符 +

c - 使用彼此的数据类型(2 Header)

c - Microsoft C/C++ 链接器优化未能丢弃未使用的代码/数据

r - 字符串作为R中的函数参数

c - 无法在 If 语句中检索或存储二维数组位置

C int 指针分配大小