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

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

宜しくご教授願います.

このQ&Aに関連する最新のQ&A

A 回答 (2件)

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



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

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


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

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

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

このQ&Aに関連する人気のQ&A

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

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

このQ&Aと関連する良く見られている質問

Qビデオカードのドライバについて

質問させて頂きます。
ビデオカードのドライバについてなのですが、ドライバというものはパソコンの周辺機器(ビデオカード)を動作させるために必要なものですよね?
でも、それだとビデオカードを搭載した新しいパソコンを買った場合にビデオカードとディスプレイをケーブルで繋いでも写らないのではないでしょうか?
やっぱりビデオカード側ではなくパソコン本体へディスプレイを繋ぎビデオカードのドライバをインストールしてから繋がないとダメなんでしょうか?
ドライバをインストールしてないとビデオカードは機能しないものですか?
詳しい回答お願いします

Aベストアンサー

購入時点で搭載されている場合は殆どの場合、ドライバは適用されていています
少なくとも私自身はその例外を知りません

あと正確には、接続した機器の性能を最大限に生かせるように最適化された機器販売メーカーが独自に提供する専用のドライバが必要であり、余程特殊な周辺機器でなければWindowsに標準で用意されているドライバで動作します

Qfp = fopen(argv[1], "r");を”w" "a" "r+"・・・で試したらどうなる

http://oshiete.goo.ne.jp/qa/8897349.html
 以上のプログラムで
 以下をfp = fopen(argv[1], "r");の
 ”r"以外で以下を入れた場合の結果がどうなるかお聞きしたいです。
"r" 読み込みモード。ファイルが存在しているとする。
"w" 書き出しモード。すでにファイルがあれば内容を削除し、なければ新たに作成する。
"a" 追加モード。すでにファイルがあればその最後に追加し、なければ新たに作成する。
"r+" 更新モード。ファイルが存在しているとする。
"w+" 更新モード。すでにファイルがあれば内容を削除し、なければ新たに作成する。
"a+" 追加更新モード。すでにファイルがあればその最後に追加し、なければ新たに作成する。
 以上ですが、試す環境がございませんので、よろしくお願いいたします。

Aベストアンサー

お書きのとおりで合ってますよ。大丈夫です。

Q現行価格5000円前後の低価格ビデオカードと同じ性能を持つ上位価格ビデオカードは何年前に売られていましたか?

・現行価格5000円前後の低価格ビデオカードと同じ性能を持つ上位価格ビデオカードは何年前に売られていましたか?

・1万円以下のものでコストパフォーマンスに優れ、評判のよかったビデオカードは何ですか?

・3D用とそうでないものがあるよですが、一番価格の安い3Dビデオカードはどれですか?また何を見て3D用と判するんですか?

・テレビが見れて録画もできるビデオカードでコストパフォーマンスと評判のいいビデオカードはなんですか?

・ビデオカードのCPUはパソコンのCPUと同じスピードで進化するのですか?

自分はゲームはあまりやりません 答えられる範囲でかまいませんので教えてください

Aベストアンサー

以下、NVIDIA製グラフィックチップでのお話とします。

>・現行価格5000円前後の低価格ビデオカードと同じ性能を持つ上位価格ビデオカードは何年前に売られていましたか?

過去発売された品物が、価格低下し今販売されています。
過去のミドル・ローエンドモデルが今の5000円前後価格となっております。

>・1万円以下のものでコストパフォーマンスに優れ、評判のよかったビデオカードは何ですか?

今現在ですと、1万円以下と言うのは難しいです。
12000円前後としまして「GeForce 6600」がよいのではないでしょうか。

>・3D用とそうでないものがあるよですが、一番価格の安い3Dビデオカードはどれですか?また何を見て3D用と判するんですか?

現行でGF6600クラスであるなら、FF11・リネージュ2といった
ネットゲームでも快適に処理してくれます。
GF FX5700クラスから下へ行くと3D機能で無理が生じてくるでしょう。
また、3D機能ですが、GF4200Tiシリーズ以上であるなら問題ありません。
しかし、GF6600以下はお勧めいたしません。

>・テレビが見れて録画もできるビデオカードでコストパフォーマンス
と評判のいいビデオカードはなんですか?

テレビの視聴・録画はTVキャプチャーカードで行います。
ビデオカードとは別代物です。

>・ビデオカードのCPUはパソコンのCPUと同じスピードで進化するのですか?

いいえ。
ビデオカード(GPU)とCPUはまったく別物です。比較対照になりません。
また、GPUの方が若干処理で上回ってるために、CPUがボルトネックと
なっている部分が一部あります。
比較対照できないため、CPUが悪いと言う訳でな有りません。


とこんな感じでしょうか?
間違い等ありましたら、他回答者の方よろしくおねがいします。


質問者様、ニュアンス的に1万円以下で3Dゲームの出来るカードを
お探しのようですが、まず、お使いのPCスペックが判らないと
間違って購入される恐れがあります。
また、1万円以下のカードは廉価版的な部分もあります。
もし、購入をお考えの場合は別途質問を立てるかなさってください。

縦長~orz

以下、NVIDIA製グラフィックチップでのお話とします。

>・現行価格5000円前後の低価格ビデオカードと同じ性能を持つ上位価格ビデオカードは何年前に売られていましたか?

過去発売された品物が、価格低下し今販売されています。
過去のミドル・ローエンドモデルが今の5000円前後価格となっております。

>・1万円以下のものでコストパフォーマンスに優れ、評判のよかったビデオカードは何ですか?

今現在ですと、1万円以下と言うのは難しいです。
12000円前後としまして「GeForce 6600」がよい...続きを読む

Qint i,j; \n i=0,j=5;

int i,j;
i=0;
j=5:
と書いてあるソースは普通ですが、
int i,j;
i=0,j=5:
と書いてあるソースもあります。
後者はC++の正しい書式ですか?

カンマ演算子というのは後者のカンマのことですか?

Aベストアンサー

 正しい書式です。

i=0,j=5;
 における、「,」をカンマ演算子といいます。2項の演算子です。カンマで区切られた演算を「左から順番に」実行し、最後の演算を結果として返します。
 したがって、例の文であれば、i=0を実行し、次にj=5を実行。そして、j=5の結果の5を結果として返します。
 ・・・
 が、本来的には、あまり、例のような使い方はしませんね。よく見られるのは、次のような場合です。

 for (i=0,j=0 ; i < 50 ; ++i,++j) {

 のような形でよく見られます。for文の各式は、一つの式でなければならないので、こんな書き方をするわけです。初期化と更新部が一つにまとまり、ループが読みやすくなるのが利点かな。

Q自分のPCに合ったビデオカード

パソコン自体が古いのですが、ゲームをやっててビデオカードが古いと感じることがあります。

ビデオカードはメモリーの増設みたいにどのビデオカードでも使えるのでしょうか??

ちなみに私のビデオカードはこれです。
SiS 661FX Rev 01 [32.0 MB]
HAL/SOFTWARE VSC(0)

知っている方教えてください。m(ー_ー)m

それと、もしよければ安価でいいビデオカードを教えてください。

Aベストアンサー

ANo.1 です。

> SONY VAIOのVGC-M33B/Wと書いてあります

デザイン優先で、かつ特殊形状の一体型パソコンです。
見た目はデスクトップ型ですが、その中身はノートパソコンと変わりません。

元々、3Dゲームをプレイするように考えて作られていない機種ですので、
ゲームプレイに必須のグラフィックボードが省かれているパソコンです。
そのため3D性能が著しく脆弱で、まともなゲームプレイはできません。

そして、先に記しましたように、特殊形状の一体型パソコンですので、
グラフィックボードを搭載して3D性能をアップする改善策を施したくとも、
それを設置するスロット自体が存在しません。

結論としては、改善のやりようがありません。
どうしても快適なゲームプレイを願うなら、パソコン自体の買い替えが必要になります。

QSendMessage(hW,WM_CREATE,0,0);を

SendMessage(hW,WM_CREATE,0,0);
を実行するとシステムがWM_DOWNやWM_CHARを発行しなくなるみたいです
というのはそれ以降キー入力を無視するようになるのです
いったんアプリをアイコン化してウィンドウ化するとWM_DOWNやWM_CHARを発行するようになります
WM_CREATEを送ってもWM_DOWNやWM_CHARを発行しなくなるのを阻止するために何か方法はないでしょうか?

Aベストアンサー

>プログラムのイニシャライズのために送ったのですが送らないで住むプログラムに変更しました

普通はそんな方法はとりません。
システムが何をするか分からないからです。

自分でメッセージを定義して、初期化処理を行うようするためのメッセージを送るほうが無難です。
WM_CREATEと同じ処理を初期化処理として行わせたいのであれば、初期化処理を関数化して自分で定義したメッセージでも呼び出せばいいのですし。


>作ったプッシュボタンを押してシステムがWM_COMMANDを送ってきた後キー関係のメッセージを送ってくれなくなります

プッシュボタンがキーボードフォーカスを持ってのるでは?

ボタンがキーボードフォーカスを持っていてもキー関連のメッセージを親ウィンドウが受け取りたいのであれば、サブクラス化をするしかないでしょう。

Qビデオカードの電源供給について

PCI-E接続のビデオカードの電源供給について
(1)PCI-E接続の全てのビデオカードは6pinコネクタで補助電源を供給するタイプなんでしょうか?
(2)補助電源を供給する必要のないPCI-E接続のビデオカードもあるんでしょうか?
(3)ビデオカードの基盤上に6pinコネクタが無ければ補助電源を供給する必要のないビデオカードという認識で大丈夫でしょうか?
(4)もし、補助電源を供給する必要のないタイプのPCI-E接続のビデオカードがあるということであれば、補助電源の供給を必要とするタイプのビデオカードに比べて省電力ということなんでしょうか?

初歩的な質問で申し訳ありませんが、よろしくお願いします。

Aベストアンサー

>1.

全てではありません。PCI-Expressスロットは75Wまでの電力を供給できるのでこれを超える消費電力をもつグラフィックボードに補助電源が必要です。ミドルエンドまでの製品はほとんど補助電源が要りません。ほとんどはハイエンドの製品ですね。

>2.

当然あります。ローエンドの製品は全て補助電源なしですし、ミドルエンドの製品もほとんど補助電源無しです。

>3.

その通りです。No.1の方の回答は誤りで「電源が足りません」というメッセージは基本的に出ません。出るとしたらパソコン全体の消費電力が不足した場合のみで、この場合は電源の交換が必要です。

>4.

基本的にはその通りです。性能が低いのに消費電力が大きい製品なんて売れませんから。最新の高性能製品は200W弱の消費電力ですがミドルエンド製品は50W前後ですね。最新のGeForce系ミドルエンドは40W~71Wの消費電力です。

Q1,1,2,3,5,8,13の合計

初心者ですみませんが、1,1,2,3,5,8,13の合計を出すプログラミングがどうしてもわかりません。どなたかご教示頂けましたら助かります。
宜しくお願いいたします。

Aベストアンサー

#include <stdio.h>

int main(void)
{
   printf("%d\n", 1+1+2+3+5+8+13);
}

Qノートパソコンとビデオカードについて

お世話になっています。

ノートパソコンにビデオカードを接続することはできるのでしょうか?(ノートパソコンに最初から付いている内蔵のビデオカードを外して、別のビデオカードを取り付けるという方法論についてと、さらに、ノートパソコンに最初から付いているビデオカードを取り外さないで、更に追加でビデオカードを接続するという方法についても是非教えてください)。
教えてください。

Aベストアンサー

デスクトップ用のカード類は使えません。ノート専用の拡張オプションは存在しますが製品は少なく割高です。
ノートはビデオ機能の拡張には不向きです。

Qfor( ; ti >= 0; ti--, ci++)

C言語のループの表記のことです

for ( ; ti >= 0; ti- -, ci++)
この意味がわかりません
自分なりに解釈すると「;ti >= 0」から始まって「 ci++ 」を繰り返しながら「 ti- - 」になるまで繰り返す、というような感じです

「;ti >= 0」から始まるとはどういう意味でしょうか?
「 ti- - 」になるまでとは???

このソースが書かれているHPです
http://www.rs.kagu.tus.ac.jp/infoserv/j-siken/H12a2/pm11.html
52行目になります


わかる方がいらっしゃったら教えてください、お願いします

Aベストアンサー

for() の 「初期設定式」「継続条件式」「再設定式」の区切りは、; です。
ですからこの場合、
初期設定式:なにもない(特に初期設定不要)
継続条件式: ti >= 0
再設定式: ti--, ci++
です。

さらに、再設定式に出てくる表現は、「コンマ演算子」といいまして、おおざっぱに言えば、コンマで区切られた式を順番に実行という意味です。
(関数の引数に現れるコンマとは別の意味です)

初期設定式のない for() は、すでにあるところから処理を継続する場合によく使われます。たとえば、

s = 0;
for (i = 0; x[i] == 0; i++); // x[i] の先頭部分の0の要素を捨てて
for(; x[i] > 0; i++)
s += x[i]; // 「そのあと」の正の部分が継続する間足し込む
という場合、

また、再設定式は、

for(i = 0, j = 10; src[i] != 0; i++, j--)
dest[j] = src[i];
のように、二つ(以上)のものを変化させたい場合。
この例では、初期設定式も、コンマ演算子を使って、2つの初期化を行っています。

for() の 「初期設定式」「継続条件式」「再設定式」の区切りは、; です。
ですからこの場合、
初期設定式:なにもない(特に初期設定不要)
継続条件式: ti >= 0
再設定式: ti--, ci++
です。

さらに、再設定式に出てくる表現は、「コンマ演算子」といいまして、おおざっぱに言えば、コンマで区切られた式を順番に実行という意味です。
(関数の引数に現れるコンマとは別の意味です)

初期設定式のない for() は、すでにあるところから処理を継続する場合によく使われます。たとえば、

s = 0;
...続きを読む


人気Q&Aランキング

おすすめ情報