- ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Segment情報の取得と設定)
Visual C/C++ と MASM で作成されたサンプルプログラムを使用したビデオカードの動作検証とは
このQ&Aのポイント
- Microsoft Visual C/C++ と MASM で作成されたサンプルプログラムを使用してビデオカードの動作検証をしていますが、アセンブラが解らない上ハード寄りのプログラミング経験が乏しく、取得/設定したい情報を思うように操作できません。
- 今後、コードをカスタマイズするにあたり、可能な部分はCへ置き換えたいと思っています。MASMで記述されている動作をCでどのように記述すればよいかについてのアドバイスを求めています。
- セグメントの取得についてFP_SEG(),FP_OFF()関数を使用することを考えていますが、上手く扱えません。質問者はC言語を使用してセグメント情報を取得・設定したいという目的を持っています。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
noname#30727
回答No.1
なんとなく、記憶が曖昧なのですが、 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;
その他の回答 (1)
noname#30727
回答No.2
確認するのを忘れたのですが、 Microsoft Visual C/C++ は、Ver.1.0 の 16ビット版の奴ですよね?
質問者
お礼
そうです. Microsoft Visual C/C++ Ver.1.51 を使用しています.
お礼
有難うございました. 正常にセグメント情報を取得できました. 今後とも何かとお世話になる機会があるかと思いますが, 宜しくお願いします.