Я пишу эмулятор NES на C / C ++ для Mac OS (я его уже написал, поэтому знаю основы).Поскольку многие аппаратные регистры отображаются в ячейках памяти, мне было интересно, есть ли какой-нибудь системный вызов, который я мог бы использовать для сопоставления адреса с результатом функции: когда он будет доступен, функция будет вызвана.(Я почти уверен, что не могу, но эй, стоит спросить.)
Вот что я хотел бы сделать:
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, и моя цель состоит в том, чтобы перекомпилировать ПЗУ в байт-код LLVM.Вот почему было бы удобно, если бы простой доступ к памяти мог вызвать функцию (как на реальном оборудовании NES).Две другие очевидные возможности решения моей проблемы - это либо кэшировать значения регистров и сохранять их в фактической памяти, либо вызывать функцию из перекомпилированного кода, чтобы сопоставить области памяти с тем, чем они действительно являются.
Спасибо!