从C访问便笺式存储器

时间:2010-07-14 13:40:17

标签: c assembly scratch-memory

这可能是一个异国情调的问题,但我希望有人可以   仍然帮助我一点;)。我想执行一个标准的C程序,   但是,在程序执行期间的某个时刻,我希望这一点   存储在本地便笺簿RAM中的指令数量是   执行。暂存器内存可供所有进程访问。让我们假设   这个本地内存从地址0x80000000开始,我会整合它   在以下C代码片段中

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);

}

假设,程序计数器将经历以下阶段   main加载到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);

任何人都知道如何做到这一点?我需要使用汇编程序跳转吗?  说明还是有更优雅的东西。

非常感谢,  岸堤

4 个答案:

答案 0 :(得分:6)

假设指令的行为类似于普通函数,您可以这样做:

#include <stdio.h>

void (*scratchpad_func)(void) = (void(*)(void))0x80000000;

int main()
{
    printf("before\n");
    scratchpad_func();
    printf("after\n");
    return 0;
}

显然,您必须使用实模式操作系统,或跳过您的操作系统/处理器组合所需的任何环节直接访问该地址空间。

(在某些体系结构中“表现得像普通函数”如果不触及被调用者保存的寄存器,就像最后的“jump $ ra”一样简单。例如MIPS。)

答案 1 :(得分:1)

将地址转换为函数指针和内联汇编程序都没有规范化,因此没有任何内容可以移植; - )

使用POSIX可以将固定地址映射为Carl提及,但是再次将其执行,没有简单的方法。

之前的帖子也没有回答,是如何在正好三条指令后跳回来......

我能想到的唯一方法就是在某处复制三条指令并在其后立即进行无条件跳转。然后使用内联汇编程序指令跳转到该位置。

答案 2 :(得分:0)

要跳转到固定位置,您可以声明一个指向函数的指针类型,然后将您的地址转换为该类型并将其作为函数调用。

如果您希望程序以外的进程可以访问此内存区域,则必须使用操作系统(Windows / Linux / OS X)共享内存原语将一块内存映射到您选择的地址。

听起来像一个疯狂的想法,但它可以成功。祝你好运!

答案 3 :(得分:0)

好几点提示。

  1. 您需要确保“便笺簿”中的内存可寻址且可执行。
  2. 确保内存位置的指令序列以ret指令结束
  3. call代码而不是跳转到它。