こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

割り込みベクターをC言語で書きたい

 皆さん、有難う御座います。時々質問させて頂いています。

 今回は、ベクターアドレスをC言語で書く方法について質問します。
 ルネサスのH8マイコンを使っています。モニターを使うとRAM上に割り込みの仮想ベクターを作れます。
 仮想ベクターには、割り込みのジャンプ先アドレスが書かれます。
 現在アセンブラで書いているのですが、C言語で書く方法は無いでしょうか。
 二つの方法で書きたいと思っています。
 アセンブラで次の二つの方法に相当するC言語命令を知りたい。

(1)ORGとEQU命令を使った方法
(2)ムーブ(Z80ならロード)命令で関数のアドレスをメモリに書く方法

 ルネサスにはHEWと言うソフトが有りますが、HEW特有の命令によらず、一般的なコンパイラが持っている機能で実現したい。

 以上宜しくお願いします。

投稿日時 - 2009-05-24 01:51:09

QNo.4985125

暇なときに回答ください

質問者が選んだベストアンサー

> *(void **)(0xFE130) = &test ;

コンパイラに依存しないという意味では、上記の方法は問題があります。
CPUアドレスをポインタにキャストしても、期待した結果になるかどうかは保証されないからです。
ただ、通常はこれで問題なく動作するでしょうが...

> 関数のアドレスを書き込む方法が分からないと配列に出来ません。

これは、

void vector00();
void vector01();
...

void (* const vectors[])() = {
 &vector00,
 &vector01,
 ...
};

のようにすれば、配列にできます。

投稿日時 - 2009-05-24 16:49:15

お礼

 回答有難う御座いました。

 この方法で配列に出来ました。
 残る課題はセクション指定です。
 No.4, No.5 さんの回答にその方法が書いてあると思うのですが、自分の能力不足のためまだ良く分かりません。
 これから調べようとしています。

 また何か有りましたら、宜しくお願いします。

投稿日時 - 2009-05-24 19:08:30

ANo.7

このQ&Aは役に立ちましたか?

9人が「このQ&Aが役に立った」と投票しています

回答(19)

ANo.19

zwi

>モニターは、ROM上のプログラムだって動かせます。
>仮想ベクタはRAM上に有ります。
>モニタとユーザが作ったプログラム両方をROMに置けます。
>モニタをそのまま使用するなら、Gコマンドでユーザプログラムを実行すれば良い。
>モニタを改造すれば、リセットスタートでユーザプログラムに飛ばす事も可能です。

そこまでしますか。
プロなら有り得ませんが、アマチュアならまぁやりたければどうぞ。
そもそも仮想ベクタがどうやって実現しているか分かってます?
表面上見えませんが、割り込み処理時に一度モニタに飛んでから更に仮想ベクタを参照して再ジャンプする仕組みになってるんで時間ロスが発生します。
それにRAM上にベクタがあることでメモリ破壊暴走の危険が増します。これもプロとしては許せません。

R32Cさんの書いているベクタの設定もそうですが、モニタを前提とした設計は無駄なことをしていると思います。

投稿日時 - 2009-05-30 11:22:06

お礼

 色々有難う御座います。

 私の知りたかった事は、回答番号No5に有る様に解決しました。
 この辺で締めませんか。

 ここは人気が有って、C言語の質問があっと言う間に増えます。
 私の方はもう解決したので、他の方の質問の回答に時間を使って頂きたいと思います。

 また何か質問した時は、宜しくお願いします。

投稿日時 - 2009-05-31 08:06:23

ANo.18

単純に、ベクタアドレスを設定する部分だけ、アセンブリ言語のソースとして
分割すればいいだけの話のように思います。
それが、Cなのかアセンブリ言語なのか、どちらでも保守性は変わらないと
思います。どちらかというとリンカの指定を省いてアドレス指定ができる
アセンブリ言語で書いたほうが保守しやすいとは思いますが

投稿日時 - 2009-05-30 09:00:28

お礼

 色々有難う御座います。

 私の知りたかった事は、回答番号No5に有る様に解決しました。
 この辺で締めませんか。

 ここは人気が有って、C言語の質問があっと言う間に増えます。
 私の方はもう解決したので、他の方の質問の回答に時間を使って頂きたいと思います。

 また何か質問した時は、宜しくお願いします。

投稿日時 - 2009-05-31 08:06:47

ANo.17

同じこととしか思えないですね。

>しかし割り込みを使うと、START_Cを個別に変更しアセンブル
>し直さなければ成りません。
>C言語だけで記述出来れば、START_Cの変更が入らなくなります。

C言語だけで記述できても、C言語で記述するベクターテーブルはコンパイル
しなおさないといけないので同じですね。

補足要求の意味がわからなかったのでしょうか?

投稿日時 - 2009-05-30 08:50:46

ANo.16

>H8/3052だけです。プログラムによって割り込みを使ったり使わなかったりすると、
>アセンブラのベクターテーブルをその都度変更しなければなりません。
> C言語で処理できれば、アセンブラ部分は変更しないで共通に使えます。

???
なんかおかしくありませんか?

Cで書こうとアセンブリ言語で書こうと、ベクタテーブルの変更が必要なら
どちらの言語でも変更が必要ですよね。
確かに、
Cで書けば当然Cで変更が必要で、おっしゃるとおりアセンブリ言語の変更は不要ですが
いったいどのような仕組みをお考えなんですか?

投稿日時 - 2009-05-29 09:46:08

お礼

 スタックポインタの設定など行うSTART_Cと言うアセンブラ・プログラムが有ります。その中で仮想ベクタの設定を行っています。
 不意な割り込みが入ってもいいように、無限ループプログラムのベクタを入れて有ります。

 割り込みを使わないC言語プログラムなら、START_Cはどれにでも使えます。

 しかし割り込みを使うと、START_Cを個別に変更しアセンブルし直さなければ成りません。

 C言語だけで記述出来れば、START_Cの変更が入らなくなります。

投稿日時 - 2009-05-29 23:30:40

ANo.15

zwi

> ルネサスで無料で提供しているモニタが有ります。 割り込みが入るとモニタに入り、そこからRAMに書いた仮想ベクタのアドレスに飛ぶようになっています。

えーと。伝わっていないかな?
全部のプログラムをROM化して、それをモニタから動かす気ですか?
モニタが動かすプログラムってRAM上だし、ベクタもRAM上ですよね。ここで言うROM化とは、ROMに全て焼く&ベクタもROMにあるモニタもない状況です。
最終的にプログラムをROM化せずRAM上でモニタで動かす実験だけの予定であれば今の方針のままで良いですがそのつもりですかと伺っています。回答番号:No.2からROM化とは、そのつもりで言ってました。

投稿日時 - 2009-05-28 22:28:15

お礼

>モニタが動かすプログラムってRAM上だし、ベクタもRAM上ですよね。

 モニターは、ROM上のプログラムだって動かせます。
 仮想ベクタはRAM上に有ります。

>ここで言うROM化とは、ROMに全て焼く&ベクタもROMにあるモニタもない状況です。

 モニタとユーザが作ったプログラム両方をROMに置けます。
 モニタをそのまま使用するなら、Gコマンドでユーザプログラムを実行すれば良い。
 モニタを改造すれば、リセットスタートでユーザプログラムに飛ばす事も可能です。

投稿日時 - 2009-05-29 23:40:33

ANo.14

zwi

>1.RAM上で開発してROMに書き込みます。
> printf()などは大きくてRAMに収まりません。
> ROMに書いて、呼び出す実験をした事があります。
>  コンパイル後にROMに書き、EQU命令で関数のアドレスを定義し、C言語で呼び出しました。

前にも書きましたがベクタを含めてROM化する場合は今のベクタをプログラムで書き換える方法は使えません。ROMですからね。そこの所はどう考えてますか?

投稿日時 - 2009-05-27 23:54:37

お礼

 ルネサスで無料で提供しているモニタが有ります。
 割り込みが入るとモニタに入り、そこからRAMに書いた仮想ベクタのアドレスに飛ぶようになっています。

投稿日時 - 2009-05-28 21:54:32

ANo.13

zwi

richardoさん、はっきりしていないので答えてください。
1.RAMで使う前提である。ROMは考えていない。
2.H8限定。
3.H8アドバンストモード専用
4.C言語だけで全てを行いたい。アセンブラやリンカ・スクリプトでは何もしない。
って事ですよね?

投稿日時 - 2009-05-27 10:51:18

お礼

 zwiさん、

1.RAM上で開発してROMに書き込みます。
 printf()などは大きくてRAMに収まりません。
 ROMに書いて、呼び出す実験をした事があります。
  コンパイル後にROMに書き、EQU命令で関数のアドレスを定義し、C言語で呼び出しました。

2.H8/3052用です。

3.そうです。アドバンストモードです。

4.C言語で対処出来るなら、C言語でやりたいという事です。

 今までの結果は、回答番号5の「お礼」に書いた通りです。
 

投稿日時 - 2009-05-27 23:16:16

ANo.12

> ヘッダ・ファイルは共通に使えるようになっていますよね。
> それと同様にC言語に伴うアセンブラ・ソフト部分も変更せず、
>C言語部分の変更だけで対処出来ないかなという事です。
???
どれだけのCPUで共通部品にしようとしているのですか?
少なくとも、ベクターテーブルを持たないCPUでは使えないことは
お分かりですよね?

投稿日時 - 2009-05-27 09:29:30

お礼

 R32Cさん、

>どれだけのCPUで共通部品にしようとしているのですか?

 H8/3052だけです。プログラムによって割り込みを使ったり使わなかったりすると、アセンブラのベクターテーブルをその都度変更しなければなりません。
 C言語で処理できれば、アセンブラ部分は変更しないで共通に使えます。

投稿日時 - 2009-05-27 22:46:03

ANo.11

zwi

>でも私の質問は、「アセンブラなら実現方法が分かるけど、C言語で実現する方法を知りたい」という事です。
gccとかHEWのCコンパイラは重いから使いたくないって事ですね。しかし、そうするとセクションはC38H.EXEだと機能的に操れない可能性が高い状況ですから無理があります。C38H.EXEを自分で改造しますかって話ですね。
その貫き通したい気持ちは好きですが、そこまでやる気がありますか?

投稿日時 - 2009-05-27 00:50:33

お礼

>C38H.EXEを自分で改造しますかって話ですね。

 そんな事はしません。私の知りたかったのは、関数のアドレスを得る方法です。アスタリスクを上手に使うと得られるみたいだけど、その方法が分からなかったのです。
 回答番号5のお礼に書いてある様に、その方法は分かりました。
 有難う御座いました。

投稿日時 - 2009-05-28 22:12:50

ANo.10

>そうなんです。C言語の本に載っているような一般性のある方法を探っています。

#1さんも 割り込み機能のないものはちょっと想像つきませんが、いいこと言っています。
割り込みベクタのないものはありますよね。SH3

ルネサスのスーパーH では、 SH1 SH2までベクタありますが、SH3以降上位のものは
ベクタテーブルは存在しません。
ベクタテーブルそのものは、アークテクチャ依存なのです。
アークテクチャ依存部分を、一般的方法でC言語で記載しても、貴殿の言う共通部品には
ならないですね。

少なくとも、ベクタテーブルの構成が同じアークテクチャのCPU間では共通部品となる
場合はありますが、管理上、共通部品とすると思わぬバグになるほうが危険だと思います。

投稿日時 - 2009-05-26 10:11:43

お礼

 R32Cさん、こんにちは

 ヘッダ・ファイルは共通に使えるようになっていますよね。
 それと同様にC言語に伴うアセンブラ・ソフト部分も変更せず、C言語部分の変更だけで対処出来ないかなという事です。

投稿日時 - 2009-05-27 00:21:47

ANo.9

zwi

>アセンブラ・ソフトは変更せず、C言語ソフトだけで対応する方法を探している次第です。

とりあえずC言語中にベクタのセクション名が指定可能なgccかHEWに変更すれば全て解決します。あえてC38H.exeを使う理由は無いはずですよね?

投稿日時 - 2009-05-26 00:06:20

お礼

 zwiさん、こんにちは

 「何でも出来るは、何も出来ない」と言う格言が有りまして、複雑なソフトは使い難い。
 C38H.exeはマニュアルが単純で理解しやすい。
 コンパイルが速いので、こまめにコンパイルしても苦にならない。

 MS-DOS時代のソフトなので、自分でバッチファイルを作れないと使いこなせませんが。

 でも私の質問は、「アセンブラなら実現方法が分かるけど、C言語で実現する方法を知りたい」という事です。
 割り込みテーブルの事は、その質問の背景です。

 関数のアドレスを知る事により、例えばスイッチ文のようにして配列に入った関数アドレスから関数を呼ぶ方法などに発展する訳です。

投稿日時 - 2009-05-26 23:37:40

ANo.8

zwi

> main関数に飛ぶ前にstart_cと言うアセンブラ・ソフトで、スタックポインタの設定や、割り込みベクタの設定をしています。
> C言語プログラムに割り込みが有ったり無かったりすると、start_cも書き換えなければなりません。
> start_cは変更せず、C言語プログラムだけで処理する方法を探っている次第です。

これの事ですかね?
> .ORG H'000070 ;IMIA1
> .DATA.L _timer1INT
> .END

(2)の通り、割り込み関数のアドレスをベクタに同様設定で(1)も解決のはずですね。割り込みを開始する前に設定しておけば問題ないです。

投稿日時 - 2009-05-24 17:31:39

お礼

 回答有難う御座います。

 C言語に付随するアセンブラ・ソフトとかサブコマンド・ファイルなどは、出来るだけ共通化してどのプロジェクトでも同じ物を使いたい。
 割り込み処理が増えたときアセンブラ・ソフトも変えるのでは、ソフトが共通部品にならず専用部品となってしまいます。
 アセンブラ・ソフトは変更せず、C言語ソフトだけで対応する方法を探している次第です。

投稿日時 - 2009-05-25 23:07:47

ANo.6

もし差支えが無いようでしたら、お使いのコンパイラーとか開発環境を教えていただけると、もっとベストな回答が得られるのではと思います。

投稿日時 - 2009-05-24 13:55:59

お礼

 回答有難う御座います。

 開発環境は秋葉原の秋月電商で売っているH8/3048用の
コンパイラです。

 MS-DOSベースで古いのですが、シンプルでコンパイル時間が短いので気に入っています。

 ルネサスのHEWは機能が多過ぎて、まだ使いこなしていません。

投稿日時 - 2009-05-24 16:59:00

ANo.5

>>一般的なコンパイラが持っている機能で実現したい
何をもって「一般的なコンパイラ」と解釈すれば良いかわからないです。
エンベデッド系では、やはりそれなりに特化してしまうのではないでしょうか?
例えば、VCでもやはりi386系に特化した命令(#pragma等)ありますし、gccでもBorland Cでも同じです。
また、関数の終わりはアセンブラいうと「rts」命令ですが、割り込み処理の関数の場合「rte」でないとNGです。やはり#pragma interrupt等で、この関数は割込み処理だから「rte」でリターンしてね!みたいに指示しないといけません。だからと言ってゴリ押してきなコーディングはやめた方が良いと思います。

それはさておき、私が知っている限り、HEWやgccで用いている方法なのですが、ベクターのテーブル化です。
具体的には、
--------------------------------
typedef void (*fp) (void);
#define VECT_SECT__attribute__ ((section (".vectors")))

const fp HardwareVectors[] VECT_SECT = {
start,
(fp)0,
(fp)0,
(fp)0,
(fp)0,
(fp)0,
(fp)0,
INT_NMI,
INT_TRAP1,
INT_TRAP2,
INT_TRAP3,
INT_TRAP4,
・・・
--------------------------------
としてベクターテーブルを「vectors」という名前でセクション化します。
そして、リンク時にLDスクリプトを用い仮想ベクタアドレスを割り当ててやるという方法です。
--------------------------------
MEMORY
{
ex_ram: o = 0x400000, l = 0x10000
vectors: o = 0xffc000, l = 0x0100
}
SECTIONS
{
.vectors : {
*(.vectors)
} > vectors
・・・
--------------------------------
という感じです。
本家RenesasのHEWやgccでも用いているので、ある意味一般的ではとおもうのですが。
以上、あくまでも、ご参考程度に。

投稿日時 - 2009-05-24 13:39:20

お礼

 回答有難う御座いました。

 質問者自身は解答欄に投稿できないようなので、此処をお借りして皆さんに今までの報告をします。

 皆さんの回答のおかげで、次の二つが分かりました。

(1)関数のアドレスの配列
void (* const vectors[64])() = { &test }

(2)関数のアドレスをベクタアドレスに直接書き込む方法
*(void **)(0xFFE130) = &test ;

 (1)を仮想ベクタに配置するために
#pragma section VEC_TEST
としましたが上手く行きません。サブ・コマンドも対応するようにしてあります。
 これはアセンブラ・ソフトの中で VEC_TEST セクションを作る事で対応出来そうです。
 ところが此処で、伏兵が現れました。

 #pragma interrupt (test) とすると、(1)(2)両方とも使えないのです。
 (1)と(2)同時ではなく、単独に書いて試験しても駄目でした。
 割り込み関数のアドレスは、求められないのです。

 せっかく良い所まで行ったのに残念です。
 でも皆さんのおかげで、色々な事が分かりました。
 有難う御座いました。

 アセンブラ・ソフトなら対応出来るので、挑戦はこの辺で中止にしようと思います。

 どうも有難う御座いました。

投稿日時 - 2009-05-25 23:49:51

ANo.4

回答1
ルネサスのCコンパイラ特有の命令
#pragma interrupt
でベクターを書くことが可能です。

-----------------------------------------------------------------------------------
H8S、H8/300シリーズ C/C++コンパイラ、
アセンブラ、最適化リンケージエディタ
コンパイラパッケージVer.6.01 ユーザーズマニュアルP.256

・ ベクタテーブル指定(vect=)をした場合は指定したベクタテーブル番号へその関数アド
レスを割り付けます。
 例:(cpu=300 の時)
 #pragma interrupt (f2(vect=4)) /* 関数f2 のアドレスを8 番地   */
 void f1(void) /* (ベクタ番号4)へ割り付けます */
 {
   :
 }
-----------------------------------------------------------------------------------

ですが、ご希望の回答ではないと思います。
1.ルネサスCコンパイラ特有の命令で一般的コンパイラではない。
2.いわゆるROMモニター用の仮想ベクタ用ではない。


回答2
一般的な方法では、結局リンカー、ロケーターの指示は必要に
なりますが、仮想ベクタなら関数アドレステーブルなので、

typedef void (*FP)(void);

const FP VECT[] =
{
(FP)handler1,
(FP)handler2,

};
という感じで書いて、仮想ベクタに割り付けられるように(ロケータ指示)
すればできるように思います。

>(1)ORGとEQU命令を使った方法
Cの一般記述方法には、ありませんが、ルネサスCの#pragma命令で
あったように思います。

>(2)ムーブ(Z80ならロード)命令で関数のアドレスをメモリに書く方法
??
FP fnc;
fnc = &handler1;
とか書けばよいのでは?

投稿日時 - 2009-05-24 11:31:56

お礼

 回答有難う御座います。

>ですが、ご希望の回答ではないと思います。
>1.ルネサスCコンパイラ特有の命令で一般的コンパイラではない。
>2.いわゆるROMモニター用の仮想ベクタ用ではない。

 そうなんです。C言語の本に載っているような一般性のある方法を探っています。
 「アセンブラなら書けるけど、C言語ではどのように書くのか」を探っています。

投稿日時 - 2009-05-25 23:17:58

ANo.3

割り込みベクタ自体は単なる配列ですので、記述することはそれほど難しくありません(説明の必要はありませんね)。

問題は、ORGに相当する機能がC言語の標準規格では規定されていないことです。したがって、これについては、どうしても処理系の独自拡張か、アセンブラまたはリンカの機能に頼らざるを得ません。
ただし、モニタによっては、任意のアドレスに仮想割り込みベクタを配置できるようになっているかもしれませんので、モニタの仕様を調べてみることをお勧めします。

なお、割り込みハンドラに関しても、本来であれば標準的なC言語で記述することができません。
H8に限定するなら、レジスタの退避・復帰やリターン命令をハンドアセンブルした内容を配列として定義してから、強引にキャストして関数とみなしてやれば何とかなります。

投稿日時 - 2009-05-24 11:21:50

お礼

 jacta さんにはお世話になっています。


 (2)については、下記のように解決しました。test関数のアドレスをベクタアドレス領域の 0xFFE130 に書き込んでいます。

-----------------------------------
voidtest(void)
{
*(void **)(0xFE130) = &test;
}
-----------------------------------------------
FF3C4 7A01000FF3C4 MOV.L #H'000FF3C4:32,ER1
FF3CA 01006B81E130 MOV.L ER1,@H'FE130:16
FF3D0 5470 RTS
----------------------------------------------




>割り込みベクタ自体は単なる配列ですので、記述することはそれほど難しくありません(説明の必要はありませんね)。

 関数のアドレスを書き込む方法が分からないと配列に出来ません。
 しかし(2)が解けたので、もう少し頑張れば(1)も出来るかなと思っています。
 配列の先頭は サブ・コマンド ファイルをいじります。


 どうも有難う御座いました。

投稿日時 - 2009-05-24 13:14:36

ANo.2

zwi

>アドレスを指定して関数を呼び出す方法は有りますか
の人ですよね。

(1)ORGとEQU命令を使った方法
一般にはC言語に該当する命令体系はありません。
マイコン専用C言語コンパイラでは特別に#pragma等で設けている場合があります。HEWにもその機能があります。下記サイトなどを参考に。
http://wave.iobb.net/doc/summary/h8wiki/wifky.cgi?p=HEW%A4%C7%B3%E4%A4%EA%B9%FE%A4%DF%A5%D7%A5%ED%A5%B0%A5%E9%A5%DF%A5%F3%A5%B0
ちなみにH8用のgccでは記述方法が異なります。

(2)ムーブ(Z80ならロード)命令で関数のアドレスをメモリに書く方法
仮想ベクターはRAM上にあるはずですから、ポインタを仮想ベクターのアドレスにセットして書き換えれば割り込みベクタを変更できます。
ですが、将来ROM化する場合に問題になりますので好ましい方法ではありません。

投稿日時 - 2009-05-24 11:09:39

お礼

>アドレスを指定して関数を呼び出す方法は有りますか
の人ですよね。

 そうです。その節はお世話になりました。


 (2)については、下記のように解決しました。test関数のアドレスをベクタアドレス領域の 0xFFE130 に書き込んでいます。

-----------------------------------
voidtest(void)
{
*(void **)(0xFE130) = &test;
}
-----------------------------------------------
FF3C4 7A01000FF3C4 MOV.L #H'000FF3C4:32,ER1
FF3CA 01006B81E130 MOV.L ER1,@H'FE130:16
FF3D0 5470 RTS
----------------------------------------------




>(2)ムーブ(Z80ならロード)命令で関数のアドレスをメモリに書く方法
>仮想ベクターはRAM上にあるはずですから、ポインタを仮想ベクターのアドレスにセットして書き換えれば割り込みベクタを変更できます。
>ですが、将来ROM化する場合に問題になりますので好ましい方法ではありません。


 main関数に飛ぶ前にstart_cと言うアセンブラ・ソフトで、スタックポインタの設定や、割り込みベクタの設定をしています。
 C言語プログラムに割り込みが有ったり無かったりすると、start_cも書き換えなければなりません。
 start_cは変更せず、C言語プログラムだけで処理する方法を探っている次第です。



 (2)が解けたので、もう少し頑張れば(1)も出来るかなと思っています。

 どうも有難う御座いました。

投稿日時 - 2009-05-24 12:48:31

ANo.1

>今回は、ベクターアドレスをC言語で書く方法について質問します。

ベクターアドレスを書く方法ですか?
ベクターアドレスといってもアドレスには変わりないですよね
(メモリ・マップドI/Oの場合)

単に16進で表記すればよいのでは?
char* p ;
p = 0x12345678;
みたいに
ま、10進がお好きなら10進でも構わないわけですが....

こんなことは常識なので
おそらく質問なさらないと思います。

おそらく

ベクターアドレス

というのは
勘違い、もしくは、誤記
の類で

本当は
割り込みルーチンの記述法
を知りたいと推測します

間違いでしたらごめんなさい

結論を申し上げます。
割り込みルーチンを書くための”規約"はC言語に定められていません。

割り込みの手順は完全にCPU依存ですし、
そもそも
割り込み機能のないCPUだってあり得ます。

脱"CPUアーキティクチャ"を目指すC言語が
割り込みを標準に取り入れないのは当然です。

ということで
各処理系に完全に委ねられています。

ですので

>一般的なコンパイラが持っている機能で実現したい。

は不可能です。

投稿日時 - 2009-05-24 09:38:53

お礼

 早速の回答有難う御座います。

 (2)については、下記のように解決しました。test関数のアドレスをベクタアドレス領域の 0xFFE130 に書き込んでいます。

-----------------------------------
voidtest(void)
{
*(void **)(0xFE130) = &test;
}
-----------------------------------------------
FF3C4 7A01000FF3C4 MOV.L #H'000FF3C4:32,ER1
FF3CA 01006B81E130 MOV.L ER1,@H'FE130:16
FF3D0 5470 RTS
----------------------------------------------



>単に16進で表記すればよいのでは?
>char* p ;
>p = 0x12345678;

 関数のアドレスなので、「char *」で無く他の何かと思っていたのですが、上の例によると、「void **」のようです。

 (1)の課題は、「char* p ;」に相当する変数の書かれるアドレスを指定したいと言うことです。それがアセンブラの「ORG」相当と言う事です。

 (2)が解けたので、もう少し頑張れば(1)も出来るかなと思っています。

 どうも有難う御座いました。

投稿日時 - 2009-05-24 12:36:11

あなたにオススメの質問