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

このQ&Aのポイント
  • アセンブラのビデオモード al 13h を使用して、マウスのポインタを表示することは可能ですか?
  • ビデオモードを設定しない場合は Alt + Enter でフルスクリーンにすると、ポインタが表示されます。
  • masm32環境で、マウスのポインタを表示するためには、ビデオモード al 13h を設定する必要があります。
回答を見る
  • ベストアンサー

アセンブラ、ビデオモード 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

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

  • ベストアンサー
  • ralf124c
  • ベストアンサー率52% (232/446)
回答No.2

お待たせしております。 以下のソースはFASSTというヨーロッパ製のアセンブラ処理系用に書き直して確認しました(ご質問のソースと同じものです)。 ------------------------------------------------ここから org $100 mov ax,$0013 int $10 mov ax,$0001 int $33 mov ah,$01 int $21 mov ax,$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
yasu182
質問者

お礼

回答ありがとうございます。 英語モードで試してポインタの表示を確認できました。 何時間か調べてみたのですが、こんな落とし穴があったんですね  そういえばデバッガの code view を使ってみた時も やはり日本語環境で文字化けしたのを覚えてます。 勉強になりました 参考資料もとても詳しいですね ありがとうございます よろしければもう一つだけお伺いしたいのですが、 x dw 20 のように宣言した後、 x の値、20 を表示するには どうすれば良いのでしょうか? Java で言う System.out.println(x); をしたいのですが... これが出来ると offset x など調べるのに便利だと思いまして。

yasu182
質問者

補足

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

その他の回答 (1)

  • ralf124c
  • ベストアンサー率52% (232/446)
回答No.1

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

yasu182
質問者

お礼

回答ありがとうございます プログラミング言語の先祖ってどんなものだろう、と思いまして ^^ オンラインで資料を探してもあまり多くないですね ユーザーが少ないので仕方ないと思いますが。 ralf124c さんはどこで資料を手に入れたのでしょうか? また、Intel のドキュメンテーションを探そうと思ったのですが みつけることが出来ませんでした。 どこかに役に立つものは存在するのでしょうか??

関連するQ&A

  • アセンブラ、ファンクションコールの使い方

    入力した一文字を改行して表示させるものを作ってます。 以下のものを書いてみまして、 一文字読み取って改行はしますが表示されません。 アドバイス頂けますでしょうか? 環境は MASM 32 です。 name double .model small .stack 100 .data prompt db 0ah,0dh,"? $" .code start: mov ax, @data mov ds, ax lea dx, prompt mov ah, 9 ;output string int 21h mov ah, 1 ;get keyboard input and store into al int 21h mov dl, 0ah mov ah, 2 int 21h mov dl, 0dh mov ah, 2 int 21h mov dl, al mov ah, 2 ;output char from dl int 21h mov ax, 4c00h ;exit int 21h end start

  • 文字を表示するファンクションコールについて

    アセンブリ言語プログラムについての質問です。 MASM32を使っています。AXレジスタの数値をah→表示、al→表示というプログラムを作ったのですが、al→表示の部分がうまく機能しせません。以下にプログラムを書きます。 (1)mov ax,3132h (2)mov dl,ah (3)mov ah,02h (4)int 21h (5)mov dl,al (6)mov ah,02h (7)int 21h (分かりやすく番号をふっています。実際のプログラムには番号はふっていないです。) 具体的どこが機能しないかというと、(5)番目の命令のalレジスタの内容をdlレジスタに転送するという命令が機能しません。デバックのT命令で確認したところ(5)番目の命令がNOPとなっていました。 このプログラムを実行すると結果的に表示されるのは「11」という文字です。(本来は12と表示したい。) 質問 なぜ(5)番目の命令がnopとなるのでしょうか?

  • NASM(独習アセンブラのサンプルソース)について

    独習アセンブラ初版5刷のサンプルソース(リスト6.7、102p)での疑問です 下の方にあるコメントアウトしているputc関数って何のためにあるんですか? どこからも呼び出してないのでいらないと思うのですが… アセンブラはNASMです ※本に書かれてるソースはコメントアウトしてません、コメントアウトしてもアセンブルできました bits 16 org 100h mov dx,sfile mov al,0 mov ah,3dh int 21h jc endquit mov [ifh],ax mov dx,dfile mov cx,0 mov ah,3ch int 21h jc endquit mov [ofh],ax readb: mov bx,[ifh] mov dx,buf mov cx,1 mov ah,3fh int 21h test cx,ax jz endquit jc endquit mov bx,[ofh] mov dx,buf mov cx,1 mov ah,40h int 21h jmp readb endquit: mov bx,[ifh] mov ah,3eh int 21h mov bx,[ofh] mov ah,3eh int 21h mov ax,4c00h int 21h ;putc: ; push ax ; mov ah,2h ; int 21h ; pop ax ; ret ifh dw 0 ofh dw 0 sfile db "srcfile.txt",0 dfile db "destfile.txt",0 buf resb 2 私が思うにリスト6.6(100p)のreadbラベルのところでこれを呼び出してるのでソースを流用して消し忘れてるだけなんでしょうか?

  • アセンブリ:FCのファイルオープンについて

    アセンブリ:FCのファイルオープンについて ファイルオープンのファンクションコールについて質問させてください。 うまく伝えられるか不安なので、いま陥っている現象を順番に書かせていただきます。 まずエディタで、 ---------------------------------- MOV AH , 3DH MOV AL , 00H MOV DX , offset FNAME INT 21H FNAME DB 'C:\xyz.txt',00H ---------------------------------- という簡易なプログラムを記述しました(擬似命令は省いています) これをアセンブルすると、 --------------------------------------- CS:0100 B43D MOV AH,3D CS:0102 B000 MOV AL,00 CS:0104 BA0901 MOV DX,0109 (*注) CS:0107 CD21 INT 21 CS:0109 43 INC BX ・ ・ --------------------------------  となるのですが、このとき AX=0003  CY となり、ファイルオープンに失敗してしまいます。 理由がまったくわからないので、デバックの直打ちで 0200 DB 'C:\xyz.txt' と格納してから、(*注)である命令を MOV DX,0200 に打ちかえれば、 AX=0005  NC となって無事にオープンできるみたいです。 なお、ファイルオープンに限らず、ファイル作成でも同じでした。 エディタでアセンブル( DX , 0109 ) だと失敗し、 デバッグ直打ち( DX , 0200 ) だと成功します。 これはいったい、どういう理由からなのでしょうか? 何冊か本を読んでみたのですが、書かれているのはコードの記述のみなので困っています。 わかる方がおられましたら、ご教授ください。 WINXP:MASM32で行っています。

  • アセンブラできません。

    初心者です。 アセンブリ言語で1~9の数字を連続的に表示するプログラムを書いたのですが、アセンブラする時 「error A2016 expression expected」というエラーメッセージが出てアセンブラすることができません。 プログラムの内容は下記↓のものです。 何が原因でしょうか? CODE SEGMENT ASSUME DS:CODE,CS:CODE,ES:CODE,SS:CODE ORG 100h START: mov bl,30h jmp aa aa: mov ah,02h mov dl,bl int 21h mov ah,06h mov dl,0ffh int 21h jnz bb: mov ah,02h mov dl,08h int 21h inc bl cmp bl,39h ja START jmp aa bb: int 20h CODE ENDS END START

  • アセンブラに関する質問

    ↓のソースをMASMでコンパイル&リンクして実行すると  入力まではできるのですが、入力した直後に   「このプログラムで無効な処理が発生したため、強制    終了されます。全てのプログラムを、終了してから    再起動してください」 と表示され、そのメッセージが表示されたウィンドウの下の方の「詳細」をクリックすると    「プログラムで一般保護エラーが発生しました     エラーが起きたアドレス 9A00:10000     サービスへの割り込み なし」     と表示されました     実行したのは↓にソースですが、何がいけなくて     このエラーが出たのでしょうか・・(OSはME) CODE SEGMENT ASSUME DS:CODE,CS:CODE,ES:CODE,SS:CODE ORG 100h START: mov ah,0Ah mov dx,offset BUFF int 21h mov ah,09h mov dx,offset BUFF2 int 21h BUFF db 54,87,5 dup(?) BUFF2 db 'testtest' '$' code ends end start

  • アセンブラについての質問です

    学校からの課題でキーボードから1文字入力し、アルファベットの大文字なら小文字に、小文字なら大文字に変換して表示するプログラムでリターンキーが押されるまで繰り返すというもので mov ah 1 int 21h sub al '0' xor al 0dh mov dl al add dl '0' mov ah 2 int 21h までやってたんですが繰り返しの所がよく分かりません 調べたんですが難しくて分かりませんでした どなたか、教えて頂けないでしょうか?出来れば、方法だけでなくソースも書いて頂けると有り難いのですが・・・ よろしくお願いします。

  • BIOSによる表示

    こんばんわ。お世話になります。 今, 自分はフロッピーをさした状態でPCの電源を入れるとそのフロッピーに格納されているプログラムが動くようにしたいと思っています。 その手始めとして, 文字を表示させたいのですが, どうもよくわかりません。 今までに自分は mov ah,0 mov al,03 int 10h で画面設定をし, mov ax,b800 mov es,ax mov di,0 mov byte ptr es:[di],41 mov ax,ff00 int 10h hlt なんてアセンブラを書きましたがwindows付属のdebugではこれはコンパイルできません。コンパイルできたと仮定して, これをrawriteでフロッピーに書き込むつもりです。 現在, 私のもとにある最も簡単なアセンブラはdebugです。nasmもありますが, 不勉強のため 使い方が良くわかりません。 有効なソースをお教えください。よろしくお願いします。

  • アセンブリ言語で。

    下のようなソースをアセンブルすると 6:error: parser: instruction expected という、エラーが出ます。 mov ah,2 mov dl,DATA int 21h mov ax,4c00h int 21h DATA byte 'A' 6行目に問題があるようなので下のように書き直したらきちんと動作しました。どうして、上のような記述ではうまくいかないのでしょうか?? mov ah,2 mov dl,'A' int 21h mov ax,4c00h int 21h 環境はwindowsXPでnasmとalinkを使っています。 nasmw test.asm -fobj alink test.obj -oEXEとしてアセンブルしました。 わかる方お願いいたします。

  • アセンブラで System.out.print(x); をする方法

    x dw 5000 例えばこのように宣言した時、x の値 5000 を dos 窓に表示するには どうするのでしょうか? Java で言う System.out.print(x); をしたいのですが... 環境は masm32、interrupt のリストはこちらです ↓ http://www.ctyme.com/intr/int.htm

専門家に質問してみよう