Это могло бы быть немного экзотической проблемой, но я надеюсь, что кто-то может все еще выручить меня немного ;). Я хотел бы выполнить стандарт C программа, однако, в какой-то момент во время выполнения программы, я хотел бы это определенное число инструкций, которые хранятся в локальной RAM временной памяти, выполняются. Память временной памяти доступна для всех процессов. Позволяет предполагают, что эта локальная память запускается в адресе 0x80000000, и я интегрировался бы, это в следующем C кодирует fragement
int main {
int a=1;
int b=2;
int c=3;
c = a + b;
%goto address 0x80000000 and execute three instructions before continuing
%program execution here
return(0);
}
Счетчик команд прошел бы следующие этапы, принятие основного загружается в 0x40000000
0x40000000 a=5;
0x40000004 b=2;
0x40000008 c=1;
0x4000000C c=a+b;
0x80000000 first instruction in the local scratch pad
0x80000004 second instruction in the local scratch pad
0x80000008 third instruction in the local scratch pad
0x40000010 return(0);
Кто-либо идея, как сделать это? Сделайте я должен использовать ассемблерные команды перехода или являюсь там чем-то более изящным.
Большое спасибо, Andi
Предполагая, что инструкции ведут себя как обычная функция, вы можете:
#include <stdio.h>
void (*scratchpad_func)(void) = (void(*)(void))0x80000000;
int main()
{
printf("before\n");
scratchpad_func();
printf("after\n");
return 0;
}
Очевидно, вам придется использовать операционную систему в реальном режиме или перепрыгивать через любые ограничения вашей ОС / Комбинация процессоров требует прямого доступа к этому адресному пространству.
(На некоторых архитектурах «вести себя как обычная функция» так же просто, как «перейти к $ ra» в конце, если вы не касаетесь регистров, сохраненных вызываемым пользователем. Например, MIPS.)
Чтобы перейти в фиксированное место, вы можете объявить тип, который является указателем на функцию, затем привести свой адрес к этому типу и вызвать его как функцию.
Если вы хотите, чтобы эта область памяти была доступна для процессов, отличных от вашей программы, вам придется использовать примитивы разделяемой памяти вашей операционной системы (Windows / Linux / OS X) для отображения фрагмента памяти на выбранный вами адрес.
Звучит как безумная идея, но ее можно заставить работать. Удачи!
Ни преобразование адреса в указатель функции, ни встроенный ассемблер не нормализованы, поэтому ничего из этого не будет переносимым; -)
Отображение фиксированного адреса, как упоминает Карл, возможно с POSIX, но опять же, чтобы выполнить это, нет простого способа.
Ни один из предыдущих постов не ответил, как вернуться назад после ровно трех инструкций ...
Единственный способ, который я могу придумать, - это скопировать где-нибудь только три инструкции и сразу же выполнить безусловный переход после этого. Затем используйте встроенную инструкцию ассемблера, чтобы перейти к этому месту.
Ну и пара подсказок.
ret
call
кода, а не переходом к нему.