3

アセンブリ言語を使い始めたばかりで (何か新しいことを学びたいと思っていました)、これまで見てきたすべてのチュートリアルで答えられない、または古すぎてわからないという質問に (これまでのところ) 遭遇しました。

1) いくつか検索してみましたが (適切なキーワードがわからないだけかもしれません)、画面解像度などを変更するためのグラフィック モードの最新リストが見つかりません。 Tutorialであり、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を照会する必要があります。

4

4 に答える 4

4

質問 1 と 3 については、VESA BIOS 拡張機能を調べてください。これは、90 年代に普及した「スーパー VGA」モードを処理するための標準のようなものでした。

#2に関しては、一般的に答えはノーです。メモリをメモリにMOVすることはできません。しかし、厳密にはそうではありません。バイト、ワード、または dword を DS:SI から ES:DI に移動する MOVS (move string) があります。通常、この命令は、メモリのブロックを移動するために REP プレフィックスと組み合わせて使用​​されます。また、スタックがセットアップされていると仮定すると、プッシュとポップによってレジスターを破壊することなく、メモリーからメモリーへ移動できます。

PUSH [mem1]
POP  [mem2]
于 2009-09-10T15:39:18.773 に答える
2

最初の質問に関しては、割り込み10は非常に古く、640x480の解像度を超えて使用されていない可能性があります。ソフトウェアスタックの別の部分が使用されるようになりました。つまり、現在の画面解像度を取得するには、Windowsに問い合わせる必要があります。

于 2009-09-10T14:56:07.597 に答える
2

このやや冗長な投稿には、アセンブラーを使用して Windows で DirectX を駆動する方法の多くの詳細が含まれています。DirectX は、最近のグラフィックスの主要な API ファミリです。DOS 時代の割り込みを使用して、VGA フレームバッファを直接プログラミングすることはできません。

于 2009-09-10T15:38:45.450 に答える
1

割り込み 10h は基本的にオペレーティング システムの関数呼び出しです (実際には BIOS コードを実行します)。内部的には、ビデオ メモリとグラフィックス カードのさまざまなレジスタを読み書きします。割り込み 10h の「範囲内」でどのようなことが起こるかを理解するには、これをチェックしてください。

Windows で DOS プログラムを実行すると、仮想 DOS マシンで実行されます。Windows では、実際にグラフィックス カードに触れることはできませんが、仮想カードで遊ぶことはできます。通常、これは VGA 画面モード (場合によってはテキスト モードのみ) までしか拡張されません。つまり、あなたが持っているのは仮想 VGA カードです (最新のグラフィック カードではありません)。このため、Windows の 16 ビット アセンブリ言語では、最新のグラフィック カードの機能をすべて使用することはできません。

はい、確かに、アセンブリ言語を使用すると、グラフィックス カードで実行できることは何でも実行できます。ただし、次のいずれかの場合のみ:

  • プログラムがグラフィックス ハードウェアに無制限にアクセスできる (たとえば、Windows または Linux デバイス ドライバーを作成している、純粋な DOS または独自のカーネルで実行している)、または
  • プログラムは、適切なオペレーティング システム インターフェイスを通過します。

アセンブリ言語にまだ興味があるなら、おもちゃのカーネルを書いてみることをお勧めします。これを行うと、山ほどのことを学ぶことができます。

さらに情報が必要な場合は、コメントを残してください。

于 2009-11-04T07:25:46.463 に答える