我正在用Mac OS的C / C ++编写一个NES模拟器(我已经写了一个,所以我知道基础知识)。由于许多硬件寄存器被映射到内存位置,我想知道是否有一些系统调用可用于将地址映射到函数的结果:当它被访问时,将调用该函数。 (我很确定我不能,但是,嘿,这值得问。)
以下是我想做的事情:
int getStatusRegisterValue()
{
return 0xCAFEBABE;
}
// obviously, more parameters than just this would be involved I suppose
int* statusRegister = syscall_to_map_function_to_address(getStatusRegisterValue);
// from here on, doing (*statusRegister) should call getStatusRegisterValue and
// return its value
*statusRegister == 0xCAFEBABE;
这个项目将是我在LLVM上的尝试,我的目标是将ROM重新编译为LLVM字节码。这就是为什么简单的内存访问可以触发功能(就像真正的NES硬件一样)会很方便。解决我的问题的另外两个显而易见的可能性是缓存寄存器值并将它们存储在实际内存中,或者从重新编译的代码中调用函数以将内存位置映射到它们实际上的任何位置。
谢谢!
答案 0 :(得分:3)
也许您可以尝试安装SEGV处理程序并检查那里的错误地址。由于我不使用Mac OS,我无法帮助你。
答案 1 :(得分:1)
这听起来就像普通的函数指针一样:
typedef int(*function_type)(void);
function_type = &getStatusRegisterValue; // store
int i = function_type(); // call
不同的语法,同样的想法?
答案 2 :(得分:1)
这不能用C(或C ++)来完成,但为了简单起见,我们只是坚持使用C语言。
你可以通过运算符重载和带有显式寻址的仿函数“模拟”(ha)这种效果,但这不是真实的。关于目标函数必须做出太多假设才能正常执行此操作。
1)您认为它总是返回相同的值。
实际上,就是这样。尽管如此,这是一个很大的假设!
答案 3 :(得分:0)
在C ++中,您可以为用户定义的类重载*
和->
运算符。这会让你实现你想要的吗?
答案 4 :(得分:0)
除非使用内存断点(实际上仅用于调试,如果在系统上可用),否则不能触发在内存访问时执行的函数。
这也与编程语言无关,你的问题主要针对现代计算机平台。