可以自己堆空间吗?软件可以在内存中自我修改吗?
我写了一些代码来展示主题,
我在内存中阅读自己的代码吗? 如何(如果可能的话)编写它并在运行时更改指令?#include<stdio.h>
#include<stdint.h>
volatile int addressBase;
uint8_t read(int address);
int main(void) {
printf("Helium word");
addressBase=(int)&main;
printf("[%X]", read( 0 ));
getchar();
return 0;
}
uint8_t read(int address)
{
const uint8_t *addr;
addr=(const unsigned char *)(addressBase+(int)address);
return (*addr);
}
答案 0 :(得分:1)
存储器通常分为只读指令存储器和可写数据存储器,可以执行也可以不执行。如果应用程序想要编写然后运行自己的代码(如JIT编译器),则可能需要使用一些特定于操作的方法来获取必要的内存块。所以是的,您可以阅读自己的说明,但我非常怀疑您是否能够修改它们。
答案 1 :(得分:1)
您可以自行承担读写堆空间的费用。
在小型嵌入式系统等受限制的小型环境中,自我修改代码可能是一种有用的技巧。然而,现代桌面或服务器CPU根本不喜欢自修改代码,因为它破坏了指令缓存,预取和流水线操作。一则轶事:TI-Scheme在386个CPU上跑得非常快。它使用自修改代码。 486个CPU引入了指令缓存,TI-Scheme崩溃了。