最新閲覧日:

始めまして,宜しくお願いします.

現在,Microsoft Visual C/C++ と MASM で作成された
サンプルプログラムを使用してビデオカードの動作検証をしていますが,
アセンブラが殆ど解らない上ハード寄りのプログラミング経験が乏しく,
取得/設定したい情報を思うように操作できません.
今後,コードをカスタマイズするにあたり,
(特に高速動作を期待するわけではないので)
可能な部分はCへ置き換えたいと思っています.

MASMで下記のように記述された動作をCで記述するにはどうすればよいでしょうか.

;------------------------------------------
move ax, xxxxxh
move es, ax ; es -> VRAMセグメント xxxxxh
assume es: nothing

中略

move es:[di], bl ; blに格納されているデータをVRAMに設定
;------------------------------------------

セグメントの取得についてFP_SEG(),FP_OFF()関数
を使用すれば良いのかと考えていますが上手く扱えません.

宜しくご教授願います.

A 回答 (2件)

確認するのを忘れたのですが、


Microsoft Visual C/C++ は、Ver.1.0 の 16ビット版の奴ですよね?
    • good
    • 0
この回答へのお礼

そうです.
Microsoft Visual C/C++ Ver.1.51 を使用しています.

お礼日時:2002/02/06 22:01

なんとなく、記憶が曖昧なのですが、



unsigned char far *di;

のように di があって、これは 32ビットのポインタで、上位 16 ビットがセグメント、下位 16 ビットがオフセットです。
例えば、

di = (unsigned char far *)0xABCD0123;

とすると、セグメントが 0xABCD で、オフセットが 0x0123 としてfar ポインタに代入できます。
このポインタを使って、

*di = bl;

とすれば、0ABCDH:0123H に 何かを書き込めます。
確か、ポインタに対する演算は、オフセットの部分だけに対してされたと思います。

di = (unsigned char far *)0xA0000000;
di--; // di == 0xA000FFFF;

FP_SEG と FP_OFF が far ポインタのセグメントとオフセットを個別に書き換える事ができたかどうかは忘れましたが、そういうマクロがなければ、とにかく書き換えてしまえば動いたような気がします。

((unsigned int *)&di)[0] = offset;
((unsigned int *)&di)[1] = segment;
    • good
    • 0
この回答へのお礼

有難うございました.

正常にセグメント情報を取得できました.
今後とも何かとお世話になる機会があるかと思いますが,
宜しくお願いします.

お礼日時:2002/02/06 22:00

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード


人気Q&Aランキング

おすすめ情報