みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

アセンブラ、ビデオモード al 13h でマウスのポインタを表示

mov ah, 0
mov al, 13h
int 10h

のモードでマウスのポインタを表示することは可能でしょうか?

以下のコードを書いてみまして、ビデオモードを設定しない場合は
Alt + Enter でフルスクリーンにすればポインタが表示されます。

環境は masm32、interrupt のリストはこちらです ↓

http://www.ctyme.com/intr/int.htm

----------------------------------

.model small
.stack 100h
.data

.code
start:
mov ax, @data
mov ds, ax

mov ah, 0; set video mode
mov al, 13h
int 10h

;mov ax, 0; reset
;int 33h

;mov ax, 20h
;int 33h

mov ax, 1; show mouse pointer
int 33h

mov ah, 1; wait for key
int 21h

mov ah, 0; restore video mode
mov al, 3h
int 10h

mov ax, 4c00h; exit
int 21h
end start

投稿日時 - 2008-03-30 18:30:13

QNo.3907812

困ってます

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

お待たせしております。
以下のソースはFASSTというヨーロッパ製のアセンブラ処理系用に書き直して確認しました(ご質問のソースと同じものです)。
------------------------------------------------ここから
org$100

movax,$0013
int$10

movax,$0001
int$33

mov ah,$01
int$21

movax,$0003
int$10

mov ah,$4c
int $21
-------------------------------------------------ここまで
 アセンブルでき、実行ファイル(COMファイル)も生成され、英語モード(WinXPならUSコマンド<->JPコマンド)では実行するとちゃんと大きなカーソルが表示されます。
 ただ、日本語モードではINT10の割り込みがフック(呼び出し先のアドレスが書き換えられる)されるているため日本語モードでは動作しないです。
 モードの切り替えもプログラムでできたと記憶していますが(CHEVコマンドを逆アセンブルしてLSI-C試食版でその部分を作り直した記憶があります)当時のソースが見当たらず申し訳ありません。
 資料の入手に関しては単純に年のせいです。リアルタイムにかかわってきた上に貧乏性で捨てられないためです。
 いま、オンラインで手に入る資料としては参考URLの「OADGテクニカル・リファレンス」が一番ではないかと思います。SOFTBANKからも「DOS/Vテクニカルリファレンスマニュアル」(1993)という本がDOS/V時代の終盤に出版されて古本屋でたまに見かけます。
 DOSには非公開の機能が多くそれについて書かれたものは上記の本以外で網羅したものは少なくほとんど洋書になってしまい現在入手は不可能かと思います。
 あと、Simtelという有名なDOS時代のオンラインソフトサイト(ftp.simtel.net)に当時の蓄積がかなり残ってます(消えたものもあります)。
 BIOSやシステムコール、割り込みを制するとDOSが見えてきます。割り込みベクターテーブル、ソフト割り込み、ハード割り込み、タイマ割り込み、なんかの言葉を調べていじってみると面白い発見があるかと思います。

参考URL:http://www.oadg.or.jp/techref/download.cgi

投稿日時 - 2008-04-04 11:55:29

補足

あらためて質問を投稿しました
いろいろなアドバイスありがとうございました ^^

投稿日時 - 2008-04-07 04:45:10

お礼

回答ありがとうございます。
英語モードで試してポインタの表示を確認できました。
何時間か調べてみたのですが、こんな落とし穴があったんですね 
そういえばデバッガの code view を使ってみた時も
やはり日本語環境で文字化けしたのを覚えてます。
勉強になりました

参考資料もとても詳しいですね ありがとうございます

よろしければもう一つだけお伺いしたいのですが、
x dw 20
のように宣言した後、
x の値、20 を表示するには どうすれば良いのでしょうか?
Java で言う System.out.println(x); をしたいのですが...
これが出来ると offset x など調べるのに便利だと思いまして。

投稿日時 - 2008-04-06 09:46:57

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

懐かしいです。
いまどきBIOSコールを使われる方がいらっしゃるとは驚きです。
いま手元に当時の資料が無いのであとで自宅で調べてみますが、たしかでかいカーソルが表示されたような記憶があります。
ただ、ビデオモードやアセンブラのコードが英語(オリジナル)環境が前提になってますので、DOS/Vだと終了時に元の画面に戻らない気がします。仮想VRAMを事前に取得してうんぬんだったかと・・・。
ちょっと、家の資料をひっくり返して見ますのでお待ちください。
追伸:
 レジスタを0クリアするときは「MOV」より「XOR」を使うのが定番です。
 例: xor al,al
 ハンドアセンブルしてみるとニーモニック長がぜんぜん違うのがわかると思います。

投稿日時 - 2008-04-02 12:30:15

お礼

回答ありがとうございます
プログラミング言語の先祖ってどんなものだろう、と思いまして ^^
オンラインで資料を探してもあまり多くないですね
ユーザーが少ないので仕方ないと思いますが。

ralf124c さんはどこで資料を手に入れたのでしょうか?
また、Intel のドキュメンテーションを探そうと思ったのですが
みつけることが出来ませんでした。
どこかに役に立つものは存在するのでしょうか??

投稿日時 - 2008-04-03 14:15:30

あなたにオススメの質問