640x480 を超える解像度の x86 asm グラフィック設定?
質問
私はアセンブリ言語を使い始めたばかりで (何か新しいことを学びたいと感じていました)、これまで調べてきたチュートリアルでは答えられなかったり、古すぎて知ることができないいくつかの質問に (これまでのところ) 遭遇しました。
1) いくつかの検索を試みましたが (適切なキーワードを知らないだけかもしれません)、画面解像度などを変更するためのグラフィックス モードの最新リストが見つかりません。私が見つけた最高のものは次のとおりです。 アセンブラーのチュートリアル, 640x480 がアセンブリ言語で使用できる最高の解像度であるとはほとんど思えません。 使用できる、より更新されたチュートリアルを知っている人はいますか?
編集:Interrupt 10h は古いため、640x480 以上を完全にはサポートしていません
2) 最初に値をレジスタに移動せずに、変数から別の変数に値を「移動」することは可能ですか?例:
jmp start
n1 dw 0
n2 dw 0
res dw 0
start:
mov n1,5
mov n2,6
mov res,n1
add res,n2
...etc...
編集:それは不可能。レジスタを使用せずにメモリ間を移動することはできません。
3) 質問 1 の話になりますが、ユーザーが現在使用しているグラフィック モードを検出して、変更したり、後で元に戻したりする方法はありますか?(あると思いますが、やり方がわかりません。)
編集:OS にグラフィック設定を問い合わせる必要があります。
解決
質問 #1 と #3 については、 VESA BIOS 拡張機能. 。これは、90 年代に人気があった「スーパー VGA」モードを扱うための標準のようなものでした。
#2 に関しては、一般的に答えは「いいえ」です。メモリをメモリに MOV することはできません。しかし、それは厳密には真実ではありません。MOVS (文字列の移動) があり、バイト、ワード、または dword を DS:SI から ES:DI に移動します。通常、この命令はメモリのブロックを移動するために REP プレフィックスと組み合わせて使用されます。また、スタックが設定されていると仮定すると、プッシュおよびポップによってレジスタを破壊することなくメモリ間を移動できます。
PUSH [mem1]
POP [mem2]
他のヒント
最初の質問に関して、割り込み10は非常に古く、640x480の解像度を超えて使用されない可能性があります。ソフトウェアスタックの別の部分が使用されるようになりました。つまり、現在の画面解像度を取得するにはWindowsに問い合わせる必要があります。
このかなり冗長な投稿には、アセンブラを使用してWindowsでDirectXを駆動する方法の詳細が多数含まれています。 DirectXは最近のグラフィックスの主要なAPIファミリです。DOS時代の割り込みを使用してVGAフレームバッファを直接プログラミングすることはあまりありません。
Interrupt 10hは基本的にオペレーティングシステムの関数呼び出しです(実際にはBIOSコードを実行します)。内部的には、ビデオメモリとグラフィックカードのさまざまなレジスタを読み書きします。 「内」でどのようなことが起こるかを知るには10時間中断し、これをチェックアウトします。
WindowsでDOSプログラムを実行すると、仮想DOSマシンで実行されます。 Windowsでは、実際にはグラフィックカードに触れることはできませんが、仮想カードで遊ぶことができます。通常、これはVGA画面モード(場合によってはテキストモードのみ)、つまり仮想VGAカード(最新のグラフィックスカードではない)までしか拡張されません。このため、Windowsの16ビットアセンブリ言語では、最新のグラフィックカードのすべての機能を使用することはできません。
はい、確かに、アセンブリ言語を使用すると、グラフィックカードでできることは何でもできます。ただし、次のいずれかの場合のみ:
- プログラムがグラフィックハードウェアに無制限にアクセスできる(たとえば、WindowsまたはLinuxデバイスドライバーを作成している、純粋なDOS、または独自のカーネルで実行している)、または
- プログラムは適切なオペレーティングシステムインターフェイスを通過します。
まだアセンブリ言語に興味があるなら、おもちゃのカーネルを書くことをお勧めします。これを行うと、たくさんのことを学ぶことができます。
さらに情報が必要な場合はコメントを残してください。