5

それは少し風変わりな問題かもしれませんが、誰かが私を少し助けてくれることを願っています;)。標準 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

4 に答える 4

6

命令が通常の関数のように動作すると仮定すると、次のことができます。

#include <stdio.h>

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

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

明らかに、リアルモードのオペレーティングシステムを使用するか、OSとプロセッサの組み合わせがそのアドレス空間に直接アクセスするために必要なフープを飛び越える必要があります。

(一部のアーキテクチャでは、「通常の機能のように動作する」は、呼び出し先が保存したレジスタに触れない場合、最後に「ジャンプ$ ra」と同じくらい単純です。たとえば、MIPS。)

于 2010-07-14T13:57:42.447 に答える
1

関数ポインターへのアドレスのキャストもインラインアセンブラーも正規化されていないため、移植性はありません;-)

Carl が言及しているように固定アドレスをマッピングすることは POSIX で可能ですが、それを実行するには簡単な方法はありません。

前の投稿のいずれも答えていないのは、正確に 3 つの命令の後にジャンプする方法です...

私が考えることができる唯一の方法は、3 つの命令だけをどこかにコピーして、その直後に無条件ジャンプを配置することです。次に、インライン アセンブラ命令を使用してその場所にジャンプします。

于 2010-07-14T14:04:23.167 に答える
0

固定の場所にジャンプするには、関数へのポインターである型を宣言してから、その型にアドレスをキャストして、それを関数として呼び出すことができます。

プログラム以外のプロセスがこのメモリ領域にアクセスできるようにする場合は、オペレーティングシステム(Windows / Linux / OS X)の共有メモリプリミティブを使用して、メモリのチャンクを選択したアドレスにマップする必要があります。

クレイジーなアイデアのように聞こえますが、それを機能させることができます。幸運を!

于 2010-07-14T13:53:22.600 に答える
0

さて、いくつかのヒント。

  1. 「スクラッチ パッド」内のメモリがアドレス指定可能で実行可能であることを確認する必要があります。
  2. メモリ位置の一連の命令が命令で終わっていることを確認してretください
  3. callコードにジャンプするのではなく、コードに移動します。
于 2010-07-14T14:03:02.293 に答える