« 山吹色のお菓子 | トップページ | 『Drive Cleaner』って何! »

2006年12月14日 (木)

直接、アドレスに何かしたい!

C言語でハードウエア寄りのプログラムを行う時
直接アドレスを操作する場合がある。

例えば指定アドレスにステータスが現れる場合など
昔やったよな~。
そんな時、どうやったかな~。
などと思いだしたのでやってみた。

確かこんな感じでもコンバートが通ったと思うのだが
もしかしたら勘違いかもしれない。

char*string="test";
0x00401020(string);

いや、多分勘違いしていると思う。
無論、今ならエラーです。

じゃあ今ならどう書くか?
キャストすると何でも出来るんですね。(笑)
今更ながら再確認。

#include<stdio.h>
#define putout_address ((void(*)(char*))0x00401020)
#define putout_table ((char*)0x00401020)
void putout(char *string){
    printf( string );
}
void main(void){
    char*string="test\n";
    void(*function)(char*);
    char a;

    function=putout;
    function=(void(*)(char*))putout_address;
    putout(string);
    function(string);
    putout_address( string );
    a=putout_table[0];
}

※実行時には、「void putout(char *string)」のアドレスが
「0x00401020」なのを確認してね。

「function」は、関数ポインタね。
「putout_address( string );」は、マジで直接アドレスを
呼び出しています。
「a=putout_table[0];」は、直接アドレスから値を読み出しています。
※書きこみも出来ます。タダし呼び出したら跳びます。

VC++とかを使用している人は、基本的に

直接アドレスを使用する事は、ありません。

ですが知っていると…
良いことがあるかもしれません。
無いかもしれません。

|

« 山吹色のお菓子 | トップページ | 『Drive Cleaner』って何! »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/108365/13062991

この記事へのトラックバック一覧です: 直接、アドレスに何かしたい!:

« 山吹色のお菓子 | トップページ | 『Drive Cleaner』って何! »