OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

Segment情報の取得と設定

  • すぐに回答を!
  • 質問No.212430
  • 閲覧数77
  • ありがとう数4
  • 気になる数0
  • 回答数2
  • コメント数0

お礼率 28% (2/7)

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

現在,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()関数
を使用すれば良いのかと考えていますが上手く扱えません.

宜しくご教授願います.
通報する
  • 回答数2
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

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

  • 回答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;
お礼コメント
redcyclone

お礼率 28% (2/7)

有難うございました.

正常にセグメント情報を取得できました.
今後とも何かとお世話になる機会があるかと思いますが,
宜しくお願いします.
投稿日時 - 2002-02-06 22:00:25
-PR-
-PR-

その他の回答 (全1件)

  • 回答No.2

確認するのを忘れたのですが、 Microsoft Visual C/C++ は、Ver.1.0 の 16ビット版の奴ですよね? ...続きを読む
確認するのを忘れたのですが、
Microsoft Visual C/C++ は、Ver.1.0 の 16ビット版の奴ですよね?
お礼コメント
redcyclone

お礼率 28% (2/7)

そうです.
Microsoft Visual C/C++ Ver.1.51 を使用しています.
投稿日時 - 2002-02-06 22:01:32
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ