![]() |
Message Log 29 | Return to Parent Menu |
Last Updated by 07/01/05(Fri) |
| |||
やっぱり 2001 年もアセンブラッ!!だねっ |
| |||
| |||
: 力卜 [2001/05/14 Mon 12:40:46] [164.71.1.146] PEの16ビットDOSアプリヘッダ(STUB)について Kohichi Nagaiさん: > 1.PE形式のプログラムは窓で実行できないか? Windows3.1以外の Windowsの MS-DOSプロンプトやコマンドプロンプト からなら実行できます。(OS/2でも出来るのかな? よく知りませんが) ただしターゲットが正しくないものは実行できないです。(例えばターゲットが Win32(x86)になっている実行ファイルは、Windows3.1では普通は実行できない) > 2.ddeb,debugなどはIPが0から始まっているので > exe形式のプログラムは、 > "This Program Cannot be run in DOS mode" > で終了してしまう PE形式のEXEは、実行ファイルの先頭に、「16ビットDOSアプリ」がヘッダ (STUB(==スタブ)と呼ぶみたい)としてくっついています。 実はこのアプリ自身が "This Program Cannot be run in DOS mode" を 表示しています。 純粋な DOSでは、PE形式の先頭の16ビットDOSアプリの部分しか認識/実行 できないのですが、この仕組みでちゃんと警告メッセージが出せるのです。 ddeb.exeや debug.exeは DOSの16ビットアプリ用のデバッガなので、これらに よってデバッグされるのは、Win32アプリの実体ではなく、STUBをデバッグ することになってしまいます。 # STUBをデバッグしてみると、とても簡単なDOSアプリだというのがわかるでしょう。 Win32アプリのデバッグには、Win32アプリ用のデバッガを使わなくては なりません。それでは。 土野明日香 [2001/05/13 Sun 23:42:22] [210.131.111.55] どもどもっ★土野明日香です。 》澤口@一升金です。 》to 土野明日香さん: 》int 21H の 440D ですが、Ralf Brown's Interrupt List 》に記載があります。 》↓ 》http://www.cs.cmu.edu/afs/cs.cmu.edu/user/ralf/pub/WWW/files.html 》それによると 》functions 46h and 66h undocumented in DOS 4.x, documented for DOS 5+ 》the DUBLDISK.SYS v2.6 driver only supports minor codes 60h and 67h 》で、 》67h (DOS 4.0+) get access flag (see #01566) 》だそうです。 もの凄く亀RESになってしまいましたが、おかげさまでIO.SYSの逆アセンブルをして、目的を達成することができました。 どうもありがとうございましたm(__)m。 akates [2001/05/12 Sat 09:08:20] [211.10.154.202] 力卜さん、 ...ちょっとこのソース、「?」と思うところがあるのですが... 例えば「int 28h」のあたりでint 9が発生したとします。 するとループはパスされ、文字表示へ行きますよね。 ところが「mov dl,cs:[KEYCHAR]」の直前あたりでまたint 9が入ったら最初のキーはとりこぼしませんか? また、そうなったら「cmp byte PTR cs:KEYCOUNT,20」の判定も正しく行われないのでは? もちろんキーボードは現在のCPUに比べればかなりの低速で、Pentiumとかで普通に実行する場合,そういうことは起きないでしょうが...(int 28hを長々占有するTSRとか...?) >どこかで、テキストVRAMに文字コードを書き込むと、 >文字が表示されるという内容を読んだことがあります。 私は、以前にも書きましたが、日本語BIOS(というかPC/AT)はわかりません^^; しかしながら、アスキー出版局「MS-DOS 6.2/V 日本語BIOSプログラマーズリファレンス」は、PC/ATの、特に日本語の画面表示のシステムに詳しくてよいと思いました。 一応知っている限り簡単に書いてみます。 1) (英語)フォントのパターンはROM上にある。(が、テキストモードではユーザが知る必要はあまりない) 2) チルダが書けないのは、日本語キーボードドライバ(JKEYB.SYS)の読み込みも省いているからでは? 日本語キーボードで、JKEYBなしにチルダを書くのは「Shift+半角/全角」だと思います。 3) 「FontSubsystem」とは、INT 15hファンクションAH=50hでしょうか? だとしたら私が下に書いたような... 日本語フォントはファイル(.FNT)にあります。INT 15hファンクションAH=50hは純正英語モードでは存在しません。 4) 日本語は本当はすべてグラフィックモードであるが、英語のテキストモード互換のビデオモードでは(仮想テキストVRAMを用意するなどして)テキストモードに近づけようと(設計者が)努力している。しかし結局互換性がないのでVRAM直接参照の英語アプリは動作しない。 らぴゅーたさん、 >MOV BL,BUF[1] ...非常に残念なのですが,このすっきりする書き方、バイト配列にしか通用しないんですよね...(ワードは[2]、Dワードは[4]...) Kohichiさん、 私の無知のせいで混乱させてしまいすみません... 私はリアルモードしかわからないんです... ikaさん、 「リファレンス」とは? 力卜 [2001/05/11 Fri 19:56:02] [164.71.1.146] int 15hのサンプル 自分の頭の整理も兼ねて、int 15hのサンプルを作ってみました。 make(キー押下)/break(キー開放)ごとにint 15hが呼ばれるのが よくわかります。なお、自分がよく使うnasmで書いてます。長くてすみません。 ;; VECT15.ASM: nasmソースでの int 15h サンプル by 力卜 ; アセンブル/リンク方法: nasm -f bin VECT15.ASM -o VECT15.COM org 100h ; 旧 int 15h ベクタを保存 mov ax,3515h int 21h mov [cs:ORGVCT15+0],bx mov [cs:ORGVCT15+2],es ; 新 int 15h ベクタを設定 push cs pop ds mov dx,NEWVCT15 mov ax,2515h int 21h ; 適当なループ処理。20回件のキーコードが発生するまでループ。 LOOPTOP: int 28h ; DOS idle 割り込み(OSに適当な処理をしてもらう) cmp byte [cs:KEYEXIST],00h je LOOPTOP mov byte [cs:KEYEXIST],00h mov dl,[cs:KEYCHAR] mov ah,02h int 21h cmp byte [cs:KEYCOUNT],20 jne LOOPTOP ; 旧 int 15h ベクタを復旧 lds dx,[cs:ORGVCT15] mov ax,2515h int 21h ; 終了 mov ax,4C00h int 21h ; 旧ベクタ保存域 ORGVCT15: dw 0,0 ; キーデータ等保存域 KEYEXIST: db 0 KEYCOUNT: db 0 KEYCHAR: db 0 ; 新 int 15 ハンドラ NEWVCT15: pushf cmp ah,4Fh je HDLR154F popf jmp far [cs:ORGVCT15] HDLR154F: ; キー入力フラグをオン、入力回数をカウントアップ mov byte [cs:KEYEXIST],0FFh inc byte [cs:KEYCOUNT] ; スキャンコードをASCIIに変換 push ds push bx push cs pop ds mov bx,TABLE and al,7Fh ; ここでmake/break判定ビットを落としてるので注意 xlatb mov byte [cs:KEYCHAR],al pop bx pop ds ; int 09h に対して、キー入力はなかったことにしておく popf push bp mov bp,sp and word [bp+6],0fffeh pop bp iret ; 変換テーブル(超手抜き:E0xx/Ex????無考慮/未検証) TABLE: ;;;; +0, +1, +2, +3, +4, +5, +6, +7, +8, +9, +A, +B, +C, +D, +E, +F db 'x','^','1','2','3','4','5','6','7','8','9','0','-','^','b','t' db 'Q','W','E','R','T','Y','U','I','O','P','@','[','n','<','A','S' db 'D','F','G','H','J','K','L',';',':','*','{',']','Z','X','C','V' db 'B','N','M',',','.','/','}','*','`',' ','c','1','2','3','4','5' db '6','7','8','9','a','m','s','7','8','9','-','4','5','6','+','1' db '2','3','0','.','x','x','x','b','c','x','x','x','x','x','x','x' db 'x','x','x','x','x','x','x','x','x','x','x','x','x','x','x','x' db 'x','x','x','x','x','x','x','x','x','x','x','x','x','x','x','x' db 'x','x','x','x','x','x','x','x','x','x','x','x','x','x','x','x' db 'x','x','x','x','x','x','x','x','x','x','x','x','x','x','x','x' db 'x','x','x','x','x','x','x','x','x','x','x','x','x','x','x','x' db 'x','x','x','x','x','x','x','x','x','x','x','x','x','x','x','x' db 'x','x','x','x','x','x','x','x','x','x','x','x','x','x','x','x' db 'x','x','x','x','x','x','x','x','x','x','x','x','x','x','x','x' db 'x','x','x','x','x','x','x','x','x','x','x','x','x','x','x','x' db 'x','x','x','x','x','x','x','x','x','x','x','x','x','x','x','x' ; ソースの終わり Tsuyoshi [2001/05/11 Fri 18:55:15] [211.8.109.26] キーボード割り込みと・・・ Tsuyoshiです。 今、この掲示板を今一度まじまじと読み直していて、やっと気づきました。 akates [2001/05/10 Thu 06:26:21] [211.10.154.239] >結局割り込みを使用する方法にしたのですね?… いや、ホントいうと、知らぬ間にそうなってたようです。 >… int 9の割り込みルーチン(ハンドラともいう)を使用するのなら >マスクを行う必要はありません。… はい、その理由がやっと分かりました。 なべちゃん [2001/05/01 Tue 14:06:50] [202.236.152.84] 一番簡単なのは >>START: >>in al, 60h >>cmp al, 01h; ESCキー >>jne START > >このループに入る前にキー割り込みをマスクしてしまうことですが。 今ごろになって、やっとこの意味が分かりました(トホホ..)。 Ichi [2001/05/05 Sat 23:36:04] [211.13.1.214] ■Tsuyoshiさん >>ループに入る前にキー割り込みをマスクしてしま >っても、 >>in al, 60h >で問題なく読めますが、… はい、結局はそういう心配だったようです。 復習のために、このスキャンキーコード表示プログラムを、 キー割り込みを使うものと、使わないものと、両方で書きたいと思って います。 INT 15hの話に戻ります。 Ichさん、 下の例、よく分かりました。どうもありがとうございました。 ・・・1つだけ不安なので、確認したいと思います。 "jmp far [(元の割り込みハンドラ)] ; callでないことに注意" の部分は、 プログラムの最初に mov ax, 3515 int 21 : で、取得したアドレスへジャンプするんですよね。 それと、またまた質問がありまして・・。 >>まだ、文字コードが・・・、まいっか。 >私がわかることなら... に、関係する内容です(^^)。 どこかで、テキストVRAMに文字コードを書き込むと、 文字が表示されるという内容を読んだことがあります。 そのかなり後になって思いました。 ならばフォントのビットパターンは、どこに格納されているのかな? DOSを、フォント情報の読み込みを省いて起動させても、英語ぐらいは書ける・・・。しかし、チルダ"~"は、書けない・・。なぜ? DOS/V FontSubsystem というのもあるけどそれとの関係は?。 また、その後になって、少しVGAをいじくって、次のようなことを思いました。 日本語環境では、常にグラフィックスモードで文字表示されているのかな? テキストモードというのもあるけど・・・。 どなたか、教えてくださる方、おられませんか^^;)。 Ichi [2001/05/11 Fri 00:10:32] [211.13.2.63] ■Tsuyoshiさん >"keyboard intercept(int 15h AH=4Fh)をフック"というのは、 >int 15h をフックするのと同じなんですよね。>カトさん ちょっと違います。Interrupt Listを見てもらえれば 分かるように、int 15hには他にも多くの機能が割り当て られていますが、単にint 15hをフックしてしまうと、 それらの機能が使えなくなってしまいます。そこで、 >割り込みハンドラの先頭で、AH=4Fhじゃなかったら >オリジナルのベクタに制御を移し ます。 例: VECT15: pushf cmp ah, 4fh je main popf jmp far [(元の割り込みハンドラ)] ; callでないことに注意 main: popf (処理) iret Tsuyoshi [2001/05/10 Thu 21:31:49] [211.8.110.155] キーボード割り込みについて Tsuyoshiです。 to akatesさん >結局割り込みを使用する方法にしたのですね? はい。 >int 9の割り込みルーチン(ハンドラともいう)を使用するのなら >マスクを行う必要はありません。(当然解除も必要ありません) ほお。 >普通は「in al,64h」でチェックせず、int 9内で、メモリ上に >設置した「受信した文字数(すなわちint 9が呼び出された回数)」を更新し、 >メインループではその値が変わったかどうかのみをチェックする、 >などという方法をとります。(いずれにしろ割り込みを使用するなら >バッファをつくらないとキーを取りこぼす可能性があります) 実は、そのキーの取りこぼしに気づいたのはあの例の書き込みの後でして、 ああ、こういう現象も起こるものなのだな、と少し気になってました。 どうやら、(いずれにしろ割り込みを使用するならバッファをつくらないとキーを 取りこぼす可能性があります)というのは、正しいようです。 もう一度この書き込みを参考に考え直したいと思います。 to カトさん >Windows9x/Meの MS-DOSプロンプトや WindowsNT/2000のコマンドプロンプトでも >ちゃんと動作させたいという気持ちはあるのですよね? はい、あります。 >キーボード割り込みハンドラ(int 09h)が呼び出すサブファンクションの >keyboard intercept(int 15h AH=4Fh)をフックしてみるというのは >どうでしょうか? >割り込みハンドラの先頭で、AH=4Fhじゃなかったらオリジナルのベクタに >制御を移します。AH=4Fhなら AL にスキャンコードが入っていますので、 >適当に処理して、フラグの CFを下げて IRETします。 >(RBLISTでは、B-154F を検索して見つけてください) ・・・・・・(考え込むTsuyoshi..)。 >スキャンコード(生のキーコード)は、必要なら変換テーブルなどを用意して、 >自力でアスキーコードなどに変換してやってください。101キーボードと106 >キーボードではキートップの文字が違うから注意してください。 どうも、アドバイスをありがとうございました。 やはりスキャンコードから文字コードへの変換は、自力でしたか。 例のINT 15hについては、知識が足りなさすぎ(か、理解力が足りなく)て よく分かりませんでした・・・^^;。 "keyboard intercept(int 15h AH=4Fh)をフック"というのは、 int 15h をフックするのと同じなんですよね。>カトさん "割り込みハンドラの先頭で、AH=4Fhじゃなかったら オリジナルのベクタに制御を移します。"というのは、 int 15h をフックする前のことですか?? > カトさん らぴゅーた [2001/05/10 Thu 17:25:00] [210.237.42.152] こんにちはakatesさん。返事どうもありがとうー 自分で入力文字数と比較すると言っときながら、アドレスと比較していましたね^^; ナイスなヒント、うれしいです それと MOV BL,BUF[1] のように書けるのは、はじめて知ったのでうれしかったです あ、それで無事コンパイル・・じゃなくてアセンブルは通ったんです そしてリンクして実行。としたら最初不正な処理になってしまい、dos窓強制終了になって焦りました。・・・しばらく考えたらexe2comしてないのにきづいてやってみたら、ばっちりでした 間抜けだなあと思いました(笑 Kochi Nagai [2001/05/10 Thu 16:58:59] [202.247.6.3] すみません、中身が抜けてしまいました 2.ddeb,debugなどはIPが0から始まっているので exe形式のプログラムは、 "This Program Cannot be run in DOS mode" で終了してしまう (IPをコードの先頭にセットすればいいのかなぁ?) 3.正常に動くプログラムをddebやdebugにかけて追跡すると 正常に通るはずが異常終了することがある 僕がやった時はだいたいセグメント0000のコードを実行して retで返ったすぐ後に飛ぶようです(debug) ↓そのときの様子。本来なら????のところに逆アセンブルした結果が入るはずだが… -u FF38:000A FFFF ???? ddebのreadmeを見たところ、解釈できない命令があるとエラーになる、 と書いてあったがこれかな? すみません、基本的なことでしたが、整理の意味をかねて 書いてみました。 これらはいずれも32bit版でリンクしたときに起こったエラーなので 16bitではまだ試しておりません。 Kohichi Nagai [2001/05/10 Thu 16:43:52] [202.247.6.9] こんにちは、Kohichiです。 今日もアセンブラで四苦八苦しております。 >カトさん カトさんのおっしゃる様にやってみたところできました! 感激です。(うるうる) どうも有り難うございました。 なんかddebとか使って正常に動くプログラムとの違いを ずっと見ていたのですが、そこで気づいた疑問点を自分なりにまとめて みました。 1.PE形式のプログラムは窓で実行できないか? これはLINK.EXEがPE形式なのに窓で実行できることから 窓ではPE形式も実行できる、といえると思います。 (PE形式のなんたるは正確には把握していないのですが…) 2.ddeb,debugなどはIPが0から始まっているので 望みがわいてきました。 よしこれからもアセンブラー目指してがんばるぞ! akates [2001/05/10 Thu 07:15:16] [211.10.154.200] らぴゅーたさん、 では、ヒントだけ。 「はじめて読むMASM」を読むといいと思います。 うそです^^;(でも半分本当) これは、記法上なかなか紛らわしいのですが、MASMでは、 たいてい MOV BL,BUF[1] か、 MOV BL,BUF+1 と書きます。 akates [2001/05/10 Thu 06:26:21] [211.10.154.239] ☆なべちゃんさん、 >ハードウェア機能なのだろうか、ソフトウェア機能なのだろうか。 ハードウェア機能です。具体的には、port 461h/43Fhなどを使います(って98ユーザーでないとあまり意味ないですね^^;...)。(たぶん「Undocumented 9821」のページにあるのではないかと...) それとソフトウェア機能というと...? 例えばページングがファンクション化されている状態でしょうか...? >towns って...プロテクトモードが標準... えっ!?(また無知) それって... DOSだと... DOSマシンですよね!? たしか386SXが最低スペックだとは聞いていましたが... だとすると...リアルモード用プログラム(例えばEDLINやSYMDEB)はどのように動くのでしょうか? ROM BIOSは??? >ハングアップしたと勘違いできるぐらい遅い... ..えーと...私のマシン(PC-98:486SX-33MHz^^;)ではそこまで遅くはないような気がするのですが...大量に連続してメモリ取得をしたりは、していないですが(なにしろ1ページずつですから)...ファンクションAX=DE04hですよね? >VCPI でのメモリアロケーションは...物理アドレスを得ることができませんし... >XMS でアロケーションする... ...私の資料(ざべ93年10月号連載記事「Advanced Assembler 386」^^;)によると、VCPIファンクション(INT 67h) AX=DE04h (メモリ1ページ割り当て)では物理アドレスを返してくれるようですが...そのことではないですか? また、XMS(私の資料ではver.3.0)によるEMB割り当て(ファンクションAH=09h)では、ハンドル番号しかもらえないのですが... 上位バージョンでしょうか...? >x86プロテクトモードプログラミングとか(詳細忘れ)のことですか? ええ、確かそんなような題名で(詳細忘れ)...^^; >ftp://ftp.abk.nu/pub/text/dosext/ >http://fileformat.virtualave.net/hardware/8259.zip ありがとうございます。 >トラ技の割り込みモードプログラミング 広告は確か目にしたことがあります...良さそうな本ですね。 >割り込み優先度が割り込みを受け付けた位置が最下位になって... なるほど、回転っぽいですね。これは何に使用するんでしょうかね。上位の割り込みでつづけざまに割り込みが起こるような場合に、下位の割り込みがぜんぜん起動できないというのを防ぎたいとか、そういうことですかね... >>EMM386(のV86モニタ)は... なにやらEMM386はバージョンごとにえらく内部仕様がかわって(XMSが必要だの必要ないだの、VCPIがあるだのないだの、DPMIをサポートするとかしないとか...)、V86モニタのリアルモード例外エミュレート部分もかなりリアルモードと違ってしまっているようなんでが... どうせ違うのなら全部 INT 00h みたいに強制終了したらかなり簡単で便利になったんでは、と思うのですが... >まったく意味のないならびになってるとか よろしかったら、私のゴミ置き場にコード順一覧表(LZH)を置きました。(表示ツールはやめました) ☆Tsuyoshiさん、 >[in al,64h ループ]でキーボードのステータスを見て、outputバッファが >一杯になった瞬間に、キーボード割り込みのマスクを解除する、 >そして、その直後にまたマスクする、というような感じです。 結局割り込みを使用する方法にしたのですね? んー...ちょっと変だと思います。 int 9の割り込みルーチン(ハンドラともいう)を使用するのならマスクを行う必要はありません。(当然解除も必要ありません) 普通は「in al,64h」でチェックせず、int 9内で、メモリ上に設置した「受信した文字数(すなわちint 9が呼び出された回数)」を更新し、メインループではその値が変わったかどうかのみをチェックする、などという方法をとります。(いずれにしろ割り込みを使用するならバッファをつくらないとキーを取りこぼす可能性があります) >まだ、文字コードが・・・、まいっか。 私がわかることなら... ☆kattyo@abkさん、カトさん、ありがとうございます。 kattyo@abkさん、私、ディレクトリセクタいじってまして...^^; >普通は必要がないのでしょう。 カトさん、よくわかります。そんなファンクション、あっても公開しないと思います。 一応「unicode.bin」覗いたら、これは確かに何かの表ですね。ただ1データの大きさが明らかに2バイトのところと1バイトのところがあります。そのうちもう少し調べてみたいと思います。 >keyboard intercept(int 15h AH=4Fh)をフック... 無関係ですみませんが、私はDOSモードでの左Ctrl/Caps Lock入れ替えTSRに利用しています...(ほしい人いないでしょうけど公開) あと、最新のMASMには16ビット版のLINK.EXEはついてないのですね...知りませんでした(またです)... 力卜 [2001/05/09 Wed 18:02:07] [164.71.1.149] WindowsでのDOSアプリ実行について Kohichi Nagaiさん: Windows9x/Meの MS-DOSプロンプトからも、WindowsNT/2000のコマンドプロンプト からも(これらを書き分ける必要性はないでしょうが、一応)、MS-DOSアプリは 動作できますので、わざわざ pure DOSをインストールする必要はないように 思います。 # 自分は、Windows上のeditorで DOS用のアセンブリソースを書いて、 # プロンプトからアセンブル、リンク、実行させています。 もし、ハードウェアを直接 in/out命令で操作してみたいのなら、pure DOS 環境を構築されるのがよいでしょう。 ところで、Kohichi Nagaiさんが書かれた masmソースですが、 自分のところで勝手に修正して、DOSアプリとして動作できました。 1. ソース修正 1-1. 最初の .486 / .model は消してしまう。 1-2. _START: の後ろに次の2命令を追加。mov ax,DATA / mov ds,ax 1-3. EBX と EDX は、すべて BX と DX にする。 1-4. オフセットテーブルの DD を DW にする。 2. アセンブル: ml /c source.asm としてリンクまではしない。 3. リンク: microsoftのftpサイト※から16ビット版のlink.exeを入手し、link source.obj; とする。 4. 実行: source.exeを実行する。 ※ftp://ftp.microsoft.com/softlib/mslfiles/lnk563.exe ではでは。 力卜 [2001/05/09 Wed 17:36:58] [164.71.1.149] キー割り込みについて Tsuyoshiさん: >いいえ、・・・内心システムコールを使わずにいろいろ作ってみよう、 >みたいな気がありましたから、・・・。 とのことなので、まったくの問題外かも知れませんが、 >このプログラム、なぜかWindows上では実行できません。MS-DOSでは、動きました。 ということなので、Windows9x/Meの MS-DOSプロンプトや WindowsNT/2000の コマンドプロンプトでもちゃんと動作させたいという気持ちはあるのですよね? だとしたら、キーボード割り込みハンドラ(int 09h)が呼び出すサブファンクションの keyboard intercept(int 15h AH=4Fh)をフックしてみるというのはどうでしょうか? 割り込みハンドラの先頭で、AH=4Fhじゃなかったらオリジナルのベクタに 制御を移します。AH=4Fhなら AL にスキャンコードが入っていますので、 適当に処理して、フラグの CFを下げて IRETします。 (RBLISTでは、B-154F を検索して見つけてください) これだと、自作アプリでWindows95/98/Me/NT4.0/2000上でちゃんと動作しています。 (自分の手抜きアプリでは、CFを下げずにそのままにして、適宜 Keyboard BIOSを 呼んでキーバッファを抜くという汚い処理をしてます…。スタック上の FLAGSの CFを下げるのが面倒くさかったんで。) スキャンコード(生のキーコード)は、必要なら変換テーブルなどを用意して、 自力でアスキーコードなどに変換してやってください。101キーボードと106 キーボードではキートップの文字が違うから注意してください。 ではでは。 力卜 [2001/05/09 Wed 17:35:21] [164.71.1.147] Unicodeについて akatesさん: DOS(Windows9xのDOS窓)上の LFN関連関数には Unicode変換ファンクションは 存在しないみたいです。LFN関連関数には Unicodeファイル名によるファイル操作 ファンクションが存在していないみたいですから普通は必要がないのでしょう。 Windows9x系なら、%windir%\system 配下には unicode.bin が、 WindowsNT/2000なら、%SystemRoot%\system32 配下には c_932.nls が あり、どうも変換テーブルらしいのですが、これらの構造について 私は知りません。 シフトJIS(CP932)からUnicode(UCS-2)への変換表はここ↓にあります。 ftp://ftp.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP932.TXT こんなの↓もありますが、こちらの方はちょっと古いみたいです(表の一部も違う…)。 ftp://ftp.unicode.org/Public/MAPPINGS/EASTASIA/JIS/SHIFTJIS.TXT もしソフトに Unicode変換を導入するのなら、フィルターなどを自作して、 上記の CP932.TXTを変換して利用するのが手っとり早いと思います。 (Windows上と同じ変換結果になるかは保証はできませんが…) あと、一般的な Unicodeの一つである UCS-2 には、little endianとbig endianの 区別があるので注意してください。普通、x86系上での実装ではlittle endianが 採用されていると思います。(LFN.TUTの例をみると、VFATのLFNの directory entry は、やはり UCS-2 little endianのようですね) ではでは。 ika [2001/05/09 Wed 15:59:51] [211.9.123.35] はじめまして、ikaと申します。 初心者なのでリファレンスを重宝させてもらっています。 ただ、オペランドの欄の、regやaccの意味の解説が見当たらないのが少し不便です。 どこかに書いてあるのでしょうか? それと、これはこの掲示板と関係ないかもしれませんが、マザーボードのBIOS(アップグレード版ではない)を置いてあるところを探してるのですが、どなたかご存知ないですか? Kohichi Nagai [2001/05/09 Wed 15:23:45] [202.247.6.7] こんにちは。Kohichiです。 どうも、色々本を読んで調べているうちに プロテクトモードではint関係は 通らないのではないか、と思い始めました。 だからインラインアセンブラでintなどの命令以外の事を学び、 自宅のパソコンにNATIVE DOSをインストールし そこでリアルモードでアセンブラを学習したいと思っています。 レス色々有り難うございました。 これからもアセンブラを学習していくつもりなので よろしくお願いいたします。 kattyo@abk [2001/05/09 Wed 10:47:03] [202.18.170.10] >だとしたらDOS(Windows)はメモリ上にこの変換表か何かを保持しているのでは? と思われるのですが... >私は知らないのですが、ロングファイル名対応で新設されたDOSファンクションで、変換を請け負ってくれるようなものはないのでしょうか... unicode は変換表が必ず必要になります。 少なくとも生 DOS ではフリーソフト以外に 変換をおこなってくれる関数はないと思います。 # あんなコード、サポートしなくてよし。 らぴゅーた [2001/05/08 Tue 19:52:21] [210.237.42.152] すいません。プログラムがTABで段下げしてたのですが なぜかなってません。ちゃんとして載せなおそうかとも 思ったんですが、だらだらと長くなってしまったので遠慮しておきます そして下に名前だけのったりして、ほんとにすいません^^; 今度から気をつけます らぴゅー [2001/05/08 Tue 19:48:14] [210.237.42.152] らぴゅーた [2001/05/08 Tue 19:39:21] [210.237.42.152] こんにちはー、はじめまして これは入力した文字を反転表示するようにしたいんです 書き終わってアセンブルしたら、まあいろいろエラーでてきて なんとかエラーを訂正できたんですけど、ただこのエラー 10行目 constant too large(大きすぎる定数) が、どうしてもわからなくて悩みました OFFSET BUFは50Hが入ってるアドレスだから その次のアドレスの入力された文字数をBLへロードしたいんです BLって8ビットだから0FFHまで入るから50Hは入ると思うので う〜んと悩んでます。 このプログラムははじめて読む8086という本に載ってるDEBUG用のをMASM互換のでやってみただけです この本見てると自分のあやふやだったのがしっかりわかり良い本だと思いました ヒントだけくださいお願いします ASSUME CS:CODE,DS:CODE CODE SEGMENT ORG 100H START: MOV AH,0AH MOV DX,OFFSET BUF INT 21H XOR BH,BH MOV BL,OFFSET BUF + 1 ←ここが10行目 CMP BL,00 JZ ENDD MOV AH,9H MOV DX,OFFSET KAI INT 21H OUTT: MOV AH,02H MOV DL,[BX + OFFSET BUF + 1] INT 21H DEC BX JNZ OUTT MOV AH,09H MOV DX,OFFSET KAI INT 21H JMP START ENDD: INT 20H KAI DB 0DH,0AH,'$' BUF DB 50H,0 CODE ENDS END START Tsuyoshi [2001/05/08 Tue 18:30:57] [211.8.111.113] ありがとう Tsuyoshiです。 すみません。・・・返事が遅れてしまいました。 Ichiさんより--------------------------------- >■Tsuyoshiさん >>ループに入る前にキー割り込みをマスクしてしま >っても、 >>in al, 60h >で問題なく読めますが、そういう心配でしょうか。 はい、そういう心配なんです。でも、akatesさんの書き込みを見ると、 勘違いしていたようです。 てっきり、キーボードのアクセス(in,out命令を含めて)ができなくなるのかと・・。 (手元の資料はいささか英語ばかりで・・・) >また、その解決法は割り込みハンドラを自分で用意したくない >(が、とにかくキーバッファにデータがたまってほしくない) >ときの解決法ですが、そのあたりは大丈夫ですか? ・・割り込みハンドラ、んん。なんとなく分かりました。 akatesさんより------------------------------- >Tsuyoshiさん、 > >>そのキー割り込みルーチンというのは、「INT9h」のことになるんですよね >そうです。 > >>ループに入る前にキー割り込みをマスクしてしまったら、・・・・??。 > >だいたいは下で議論されている通りですが、まとめますと... > >このプログラムの方法は、キー割り込みを使用しないキーコード入力法です。 > >通常はこのような方法は用いませんが、 >リアルタイムなキー入力が必要な場合(ゲームなど)には使われます。 > >したがってキー割り込みを使用しているBIOSとの競合が生じるので、 >キー割り込みをなんらかの方法で使用させないようにする必要がありました。 >(下にあった通り) つまり、フックする、のような。 >「ループ」とは、「jne」によって「START」に戻ることで >ぐるぐると回っていますからそのことを指しています。 >(これはわかりますか...^^;) はい、分かります。 >「(割り込みの)マスク」は下でも議論されているように >割り込みマスクレジスタの該当ビットをセットすることです。 >(これもOKでしょう) はい、オッケーです。 >マスクを行うと、キーを押しても割り込みルーチンは一切起動されなく >なります。 ということは、Int9hは起動されなくなる・・。ということは、 フックした割り込みルーチンは効果なし、ですか。 >したがってプログラムのこの部分のみでは問題は発生しませんが、 >後でDOSに戻るなどして通常のキー入力が必要となる場合、 >その前に「割り込みマスクを解除」しておく必要があります。 いろいろとアドバイス?ありがとうございました。 特に、「マスクを行うと、キーを押しても割り込みルーチンは 一切起動されなくなります。」というのは、重要でした。 いろいろ考えた末に、やっとマスクを施行する、または解除する タイミングが解りました(おいおい)。 [in al,64h ループ]でキーボードのステータスを見て、outputバッファが 一杯になった瞬間に、キーボード割り込みのマスクを解除する、 そして、その直後にまたマスクする、というような感じです。 問題すべて解決です。あ、いやまだ、文字コードが・・・、まいっか。 #ああ、それにしても、皆さん凄いですね(UNICODE、詳しく知らないけど、 #共通化機関が注目しているコード?)。 #僕は、まだまだ教えられる側ですので、よろしくお願いします。 Kohichi Nagai [2001/05/08 Tue 18:23:05] [202.247.6.8] こんにちは。レスどうも有り難うございました。 この前自分で書いた内容なのですが、 DOSモードで実行したところ "This Program cannot be run in DOS mode" が表示されました。 これは自分で色々探してみたところどうもPE形式になっている から、ということでした。 (皆さんはもう既に知ってらっしゃる事でしょうが…) この前の書き方は悪かったですね。すみません。 ここでakatesさんのおっしゃるようにしてみたのですが やはり保護違反になります。 やはりなべちゃんさんのおっしゃるように、 DOSfunctionが禁止されているのでしょうか? というのも、DOSモードで走らせたときに int21hが通って、normal terminationとなるからです。 (ただ前述のようにプログラム自体は動かないのですが…) そこでWIN上で動かすのはとりあえずあきらめて DOSモードで動かそうと思うのですが、 PE形式でないプログラムを作成できません。 .286やらを書いてもやはりPE形式になってしまうのです コマンドラインオプションにも該当するものは(PE形式でなくするもの) はないように思えますし、どうのようにしてPE形式でないプログラム を作ればよいのでしょうか? akates [2001/05/08 Tue 13:39:16] [211.10.154.225] Kohichiさん、 おっと、「.code」を使っていないのでしたね。 それなら「.486」は「CODE SEGMENT」の後ですね... akates [2001/05/08 Tue 05:23:36] [211.10.154.209] すいません、ちょっと急いでいるのでとりあえず... Kohichiさん、 たしか、「.486」を「.model」より前に使うとUSE32がデフォルトになると思います。 「.model」の後に「.486」を入れてみてください。 なべちゃん [2001/05/07 Mon 18:12:07] [202.236.152.84] free386 ★akatesさん >いわゆるRAMウィンドウというやつで、PC-98のすべての機種ではないですけれど、 >バンク切換えで、アドレス8,0000h~9,FFFFhの部分に128KB単位でCPU RAMの好きな部分(一部制限あり)を >投影させることができます(BMSに酷似^^;) すご。ハードウェア機能なのだろうか、ソフトウェア機能なのだろうか。 (前者ならほんとうにすごいなぁ) >なべちゃんさんはTownsだそうですが、おそらく同様の機能があるのではないですか? towns っておかしなマシンでプロテクトモードが標準ですから、 すきなアドレスにアクセスしほうだいなわけで(^^;; >...VCPIは...よくわかりません(;_;)。16MB以上をなぜ割り当てられないのか...とか... >もうトラ技の例の本、手に入らないでしょうね... VCPI でのメモリアロケーションはハングアップしたと勘違いできるぐらい遅いので お勧めしません(物理アドレスを得ることができませんし)。 VCPI はあくまで CPU mode の切り替えに使って、XMS でアロケーションするほうがいいですよ。 (私はそうしました) #x86プロテクトモードプログラミングとか(詳細忘れ)のことですか? #ちなみに VCPI と XMS(Ver.3) についてはファンクションをファイルにしてあります。 ftp://ftp.abk.nu/pub/text/dosext/ >「詳細は8259のデータシート等を参照してください」という風に書かれていたりするのですが、 私もそれにこりた口ですが(ダメじゃん)。今探したら http://fileformat.virtualave.net/hardware/8259.zip に落ちてるみたいです。 私は、トラ技の割り込みモードプログラミング(他書籍)で学びましたが。 >「回転」ってかんたんに言うと何でしょう? 知りたいです。 うろ覚えですが、割り込み優先度が割り込みを受け付けた位置が最下位になって 受け付けた割り込みの次の割り込みが最優先になるのだったお思います。 >EMM386(のV86モニタ)はINT 06h(無効OPコード)を発生させているようなんですが... なんでだろう(^^;; 86モードでの互換性で、そうなのかも知れません。 # 調べないと不明 >PC-98用DOSでは、これはFEPをロードしていないとダメなのでしょうが、 あるといいなぁ、だけど無いような気も(^^;; UNICODE ってのは、アメリカ人のセンスで世界中の似た記号をならべたものですから、 まったく意味のないならびになってるとか(^^;; < 某氏の受け売り ★Kohichi Nagaiさん >DOSfunctionってint21hのことですよね。 Yes. まぁ、int 20h, int 22h - 2fh その他も含みますが。 >use16のオブジェクトはwin上では使えないのですか? >これが許されていないという状況があるのでしょうか? Windows program では、int 21h が全部許可されてるとは限りません。 (現に、int 25h(?) とかのディスク直接アクセスは多々制限されますし) とりあえず、実行している exe ファイルを エディタで無理矢理、 またはバイナリエディタで開いて、"PE" と書いてないか確認してください。 (余談ですが、UPE となってたらかなりデンジャーです。すぐに名乗り出ましょう >all) >CODE SEGMENT >ASSUME CS:CODE,DS:DATA,SS:STACK 最新の MASM でどうなったかは知りませんが、"use 32" とかかない限り、 use 16 のコードを生成するような気がしますが。 Kohichi Nagai [2001/05/07 Mon 11:24:46] [202.247.6.2] みなさんこんにちは 先日書き込みさせて頂いたkohichiです。 レス色々有り難うございます。 私事ですが実家に帰っていたので返信が遅れてしまいました。すみません >akatesさん いつもは窓のほうで実行しています。 一応DOSmodeでもやってみましたが横文字で「実行できない」 とかなんやらのエラー警告がでてやはり動きません コンパイルとリンクを別にやってみたのですがやはりだめでした >なべちゃんさん >use 16 なオブジェクトを PE形式 で出力して矛盾したとか、 >DOS function が許されてないだけとか、 use16のオブジェクトはwin上では使えないのですか? DOSfunctionってint21hのことですよね。 これが許されていないという状況があるのでしょうか? (int30hでブルースクリーンになってしまうのと何か関係ありますか?) ちょっと長くなってしまうのですがソースを乗せさせてください masmで作成しました .486 .model tiny,stdcall CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK _START: INIT: MOV EBX,0 NOINPUT: MOV AH,06H MOV DL,0FFH INT 21H ;文字get、入力ありでzeroフラグがたつ JNZ PRINT INC EBX CMP EBX,5 JGE INIT JMP NOINPUT PRINT: SHL EBX,1 ;Stringを表示する MOV EDX,TABLE[EBX] MOV AH,09H INT 21H MOV AH,4CH ;OSに処理を戻す MOV AL,00H INT 21H CODE ENDS DATA SEGMENT TEST1 DB 'TEST1',0DH,0AH,'$' TEST2 DB 'TEST2',0DH,0AH,'$' TEST3 DB 'TEST3',0DH,0AH,'$' TEST4 DB 'TEST4',0DH,0AH,'$' TEST5 DB 'TEST5',0DH,0AH,'$' ;データ領域の確保 TABLE DD OFFSET TEST1,OFFSET TEST2,OFFSET TEST3 DD OFFSET TEST4,OFFSET TEST5 DATA ENDS STACK SEGMENT STACK DB 100H DUP(?) STACK ENDS END _START ちなみになにも行わずOSに処理を戻す MOV AH,4CH ;OSに処理を戻す MOV AL,00H INT 21H の三行だけを実行してもやはり一般保護違反になってしまいます akates [2001/05/07 Mon 07:25:14] [211.10.154.190] http://web11.freecom.ne.jp/~akates/ Ichiさん、ありがとうございます^o^ ところで「ユニコード」ですが、文字を順番に並べて眺めてみました。(Webページにユニコード文字一覧表示ツール掲載。誰もいらないかも) 従来コードと違って「部首」順になっているようですが、そうすると、これをシフトJISなどと変換し合う場合、かならず巨大なコード表が必要になってしまうのでしょうか... だとしたらDOS(Windows)はメモリ上にこの変換表か何かを保持しているのでは? と思われるのですが... 私は知らないのですが、ロングファイル名対応で新設されたDOSファンクションで、変換を請け負ってくれるようなものはないのでしょうか... PC-98用DOSでは、これはFEPをロードしていないとダメなのでしょうが、INT DChでJISとシフトJISの変換をするファンクションが存在しているようです(CL=F3h/F4h)...(もっともこの変換は非常に短いルーチンで済みますが...) Tsuyoshiさん、 >そのキー割り込みルーチンというのは、「INT9h」のことになるんですよね そうです。 >ループに入る前にキー割り込みをマスクしてしまったら、・・・・??。 だいたいは下で議論されている通りですが、まとめますと... このプログラムの方法は、キー割り込みを使用しないキーコード入力法です。通常はこのような方法は用いませんが、リアルタイムなキー入力が必要な場合(ゲームなど)には使われます。 したがってキー割り込みを使用しているBIOSとの競合が生じるので、キー割り込みをなんらかの方法で使用させないようにする必要がありました。(下にあった通り) 「ループ」とは、「jne」によって「START」に戻ることでぐるぐると回っていますからそのことを指しています。(これはわかりますか...^^;) 「(割り込みの)マスク」は下でも議論されているように割り込みマスクレジスタの該当ビットをセットすることです。(これもOKでしょう) マスクを行うと、キーを押しても割り込みルーチンは一切起動されなくなります。 したがってプログラムのこの部分のみでは問題は発生しませんが、後でDOSに戻るなどして通常のキー入力が必要となる場合、その前に「割り込みマスクを解除」しておく必要があります。 Ichi [2001/05/05 Sat 23:36:04] [211.13.1.214] ■akatesさん >ロングファイル名(ディレクトリエントリ上)の文字コードの種類 UNICODEらしいです。 長いファイル名の基礎講座(清十郎さん) http://www.vector.co.jp/soft/data/prog/se044198.html ■Tsuyoshiさん >ループに入る前にキー割り込みをマスクしてしま っても、 >in al, 60h で問題なく読めますが、そういう心配でしょうか。 また、その解決法は割り込みハンドラを自分で用意したくない (が、とにかくキーバッファにデータがたまってほしくない) ときの解決法ですが、そのあたりは大丈夫ですか? Tsuyoshi [2001/05/05 Sat 10:02:55] [211.8.109.209] Keyboard..... Tsuyoshiです。 >なるほど、私が外したようです... いいえ、・・・内心システムコールを使わずにいろいろ作ってみよう、 みたいな気がありましたから、・・・。 >通常はキー割り込みルーチンの中で一度だけin ax,60hを行い、 >それ(axの値)を順次バッファ領域(キーバッファ)に貯えます。 >キーが押されるたびに割り込みルーチンが呼び出されますから、 >その間表のプログラムは何もせず、ただバッファにデータが入れられていくのを >見ていればよいのです。 ・・・それでは、そのキー割り込みルーチンというのは、 "キーが押されるたびに割り込みルーチンが呼び出されますから" 「INT9h」のことになるんですよね(間違ってたらすみません)。 --------------------------------------------------------- なべちゃん [2001/05/01 Tue 14:06:50] [202.236.152.84] 一番簡単なのは >START: >in al, 60h >cmp al, 01h; ESCキー >jne START このループに入る前にキー割り込みをマスクしてしまうことですが。 (マスクをとかないで終了したり、その部分をディバガでおいかけると とまりますけど) ----------------------------------------------------------- 実は、この部分が読解困難なんです。ループに入る前にキー割り込みを マスクしてしまったら、・・・・??。 すみません、かなり簡単なことかもしれませんが、どなたか教えてください。 akates [2001/05/03 Thu 20:38:38] [211.10.154.170] >要するに、コンピュータのことを >もっと知りたいからやってるだけです。安心してください なるほど、私が外したようです... >キー割り込みを使ってどうやってキー入力を実現させるのかが いまいちです(^^;)。 通常はキー割り込みルーチンの中で一度だけin ax,60hを行い、それ(axの値)を順次バッファ領域(キーバッファ)に貯えます。 キーが押されるたびに割り込みルーチンが呼び出されますから、その間表のプログラムは何もせず、ただバッファにデータが入れられていくのを見ていればよいのです。 BIOSのキー入力ファンクションもそうした処理をおこなっています。 Tsuyoshi [2001/05/03 Thu 17:20:43] [211.8.110.206] Tsuyoshiです。 akatesさん、なべちゃん、どうも書き込みありがとうございます。 >... 私が思うに、「ふつう」のプログラミングではI/Oポートや >BIOS(int 10hなど)は使わずに、なるたけDOSファンクション(int21h) >を使うべき(たしか教科書によく書いてある...)と思うのですが... 僕もそれはもちろんのことだと思います。DOSファンクションはC言語での標準規格と 似たようなものですから。 しかし、僕の悪い癖で、そのファンクションの正体が知りたいんですね。 「それはそういうものなんだ」と言ってしまえばすむ話なのですが・・・。 アセンブラをするきっかけになったのは、C言語でした。 C言語でも同じようなことをしていました(^^;)。 だから、アセンブラの世界に踏み入ったときは、今までの疑問がふっきれたような感じです。 そうして、結局到着したのが、ポート入出力。 兄が、夏に大学から帰ってきたとき、そのPortというやらものの存在を耳にしました。 あ、長くなりそうなのでこの辺で。要するに、コンピュータのことを もっと知りたいからやってるだけです。安心してください。 >ちなみにDOSはキーバッファ(標準入力)のクリアファンクション(AH=0Ch) >も用意しているみたいです... どうも、情報提供ありがとうございました。 探したんですが見当たらなくって・・・(そういえば INT21h は探さなかったような)。 >>でも、そのキー割り込みをマスクすると、キーボードからの入力が出来なくなる >>なんてことはないのでしょうか? > 'なべちゃん'さん > >できなくなりますので、終わったら戻しましょう。 >Windows環境下では、怒られるかもしれませんが(システムに)。 では、割り込み中はキー入力に関する処理 (in ax, 60hなど) は できなくなるんですね・・・。 んー(考え込むTsuyoshi)。 キー割り込みを使ってどうやってキー入力を実現させるのかが いまいちです(^^;)。 akates [2001/05/03 Thu 06:12:15] [211.10.154.212] 私は現在、ロングファイル名(ディレクトリエントリ上)の文字コードの種類がわかりません。 ちょっと下の方になってしまいましたが... >int 15h BIOS でしたっけ? ひょっとしてご存知かもしれないんですけれど、INT 1Fh(プロテクトモードBIOS)ではないんです。(INT 1Fhはいくつかの理由から使ってません...) いわゆるRAMウィンドウというやつで、PC-98のすべての機種ではないですけれど、バンク切換えで、アドレス8,0000h~9,FFFFhの部分に128KB単位でCPU RAMの好きな部分(一部制限あり)を投影させることができます(BMSに酷似^^;) なべちゃんさんはTownsだそうですが、おそらく同様の機能があるのではないですか? 私はこの機能けっこう面白いと思うのですが...(たしかH98では公開機能/98noteはまた別) >それは大変ですね... ...VCPIは...よくわかりません(;_;)。16MB以上をなぜ割り当てられないのか...とか... もうトラ技の例の本、手に入らないでしょうね... >はい、分かりました。 ああっ、拒否ではないんです。ただゴミな内容なんで(PC-9801特定機種用ツールなど)... >8259Aの資料を直接拾ってくる... ...本とかにもよく、「詳細は8259のデータシート等を参照してください」という風に書かれていたりするのですが、どうやったらコントローラ等の「データシート」と呼ばれる書類を手にすることができるのでしょうか。それともこれとは違うのかな... >回転とかは多少分かりますが、... 「回転」ってかんたんに言うと何でしょう? 知りたいです。 >それは起こると思います。 ちなみに本来ならこの例外(0FFFFhからのワードや、0FFFDh以降からのDワードアクセス)はINT 0Dh(GP)のようですが、EMM386(のV86モニタ)はINT 06h(無効OPコード)を発生させているようなんですが... Tsuyosiさんへ あの...余計なお世話かもしれないんですが... 私が思うに、「ふつう」のプログラミングではI/OポートやBIOS(int 10hなど)は使わずに、なるたけDOSファンクション(int 21h)を使うべき(たしか教科書によく書いてある...)と思うのですが... 「ふつう」でなかったらすみません... ちなみにDOSはキーバッファ(標準入力)のクリアファンクション(AH=0Ch)も用意しているみたいです... なべちゃん [2001/05/02 Wed 19:15:48] [202.236.152.84] 割り込みマスク >でも、そのキー割り込みをマスクすると、キーボードからの入力が出来なくなる >なんてことはないのでしょうか? > 'なべちゃん'さん できなくなりますので、終わったら戻しましょう。 Windows環境下では、怒られるかもしれませんが(システムに)。 よく考えたら一番簡単なのは、バッファが空になるまでキー入力を 読み出してやることですね。問題も起こりませんし。 dos function のキーの読み出し(入力待ちじゃない方)を 空になるまで使えば十分でせう。 #(さんはなくても可。"ちゃん"をとっても可) Tsuyoshi [2001/05/02 Wed 18:48:47] [211.8.110.60] Keyboard.... Tsuyoshiです。 Ichiさん、書き込みどうもありがとうございます・・・。 >VECT9でbhを破壊するのは危険ですよ。VECT9が、いつ、 >どんな時に呼び出されるのか全く分からないわけですから。 あ、これが、よく聞く「レジスタの破壊」という現象(?)なんですね。 ふむふむ、了解しました。 >グローバル変数でやりとりしてみてはどうですか? はい、やってみます。・・・・・VECT9に mov ds:[bx], al を追加してコードを書き直しました。・・動きました。うれしいです。 >>キー割り込みをマスク >というのは、(割り込みコントローラをいじって) >キー割り込みが起こらないようにする、くらいの意味です。 ふむふむ。 ・・・割り込みコントローラは、Ralf Brown さんの資料より Port 20h-21h, A0h-A1h になっています。Windows95でも、そうなってました。 その資料に、 : Port 0021h : Read/Write PIC master interrupt mask register OCW1 (see #P0014) Bitfields for PIC output control word OCW1: Bit(s) Description (Table P0014) 7 disable IRQ7 (parallel printer interrupt) 6 disable IRQ6 (diskette interrupt) 5 disable IRQ5 (fixed disk interrupt) 4 disable IRQ4 (serial port 1 interrupt) 3 disable IRQ3 (serial port 2 interrupt) 2 disable IRQ2 (video interrupt) 1 disable IRQ1 (keyboard, mouse, RTC interrupt) 0 disable IRQ0 (timer interrupt) : てのがありますが、この1bitだけをオンにしてPort 0021hに送ればよいのですね。 でも、そのキー割り込みをマスクすると、キーボードからの入力が出来なくなる なんてことはないのでしょうか? > 'なべちゃん'さん Ichi [2001/05/01 Tue 23:47:05] [211.13.2.108] ■Tsuyoshiさん VECT9でbhを破壊するのは危険ですよ。VECT9が、いつ、 どんな時に呼び出されるのか全く分からないわけですから。 グローバル変数でやりとりしてみてはどうですか? >キー割り込みをマスク というのは、(割り込みコントローラをいじって) キー割り込みが起こらないようにする、くらいの意味です。 ■ハヤシさん Jun's Homepage(http://www.nk.rim.or.jp/~jun/) なんかどうですか? Tsuyoshi [2001/05/01 Tue 18:46:13] [211.8.110.60] Keyboard... Tsuyoshiです。 Ichiさん、'なべちゃん'さんの、お早いお返事に感謝です。 さて・・・・・、内容のほうに入ります。 >>IRQ1 - KEYBOARD DATA READY >ってのは、キーボードのキーが押された/離されたときに >発生する割り込みです。普段はBIOSがこれを処理します。... -From Ichi- ほう、だからキーボードのボタンの押下状況を確かめることが出来るんですね。 納得しました。 というのも、自分でシステムコールを使ってINT9hをフックしてみたんです。 そのフックしたものを実際に実行してみると、 なるほど、キーボードも鳴かなくなったし、実行中に入力したキーたちも 終了した後にひょっこり顔を出すようなことはなくなりました。 しかし、まだ問題は残りました。数十行、コードを書かせていただきます。 -For LASM- COM形式 START: INT9hをVECT9にフック MAIN: xor ax, ax -Ralf Brown さんの資料より- in al, 64h ;'KB controller'から'Bitfields status'を読み込んで test al, 00000001b ;KBの'output buffer'が'full'かどうかを確かめる jz MAIN ;そうでなければ MAIN: へジャンプ mov al, bh ;VECT9:からもらった bh に入っているScanCodeをコピー call NUM_PRIN ;axレジスタの内容を16進数で表示 cmp bl, 81h ;ESCキーを離すときのScanCode(だったと思う) jne MAIN jmp QUIT ;終了ルーチンへ ;----------------------- VECT9: cli ;割り込み禁止 push ax ;レジスタ保管 in al, 60h ;ScanCodeの読み込み mov bh, al ;ScanCodeをバックアップ mov al,20h out 20h,al ;割り込みコントローラーに終わりを告げる pop ax ; sti ;割り込み許可 iret ;終了 このプログラムは、何かキーボードのキーが押されると、'output buffer'が 一杯になるという前提で作りました。 初めは、VECT9は何もしないようにして、今入っているルーチンはMAINのほうに 譲っていました。でも、それでは何か不都合が起こるようで、ESCキーを 押したとたんにとまってしまうことがしばしば発生しました。これは、 >>START: >>in al, 60h >>cmp al, 01h; ESCキー >>jne START > >このループに入る前にキー割り込みをマスクしてしまうことですが。 >(マスクをとかないで終了したり、その部分をディバガでおいかけると > とまりますけど) -From なべちゃん- と、何か関係がありそうですが、その、「キー割り込みをマスク」というところが、 いまいちです。 特に、そのマスクという言葉の意味を知らないのが致命的です(せっかく 書き込みしてくれたのに、・・わかんないよぉぉ(ToT))。 このプログラム、なぜかWindows上では実行できません。MS-DOSでは、動きました。 何故なのでしょう? 僕にはまだ解りません。 そして、もう1つ、ASCIIコードの出所が謎です。どなたか教えていただけませんか。 #ハヤシさん、・・・ぜんぜん違う話で申し訳ありません・・。 ハヤシ [2001/05/01 Tue 15:58:10] [202.19.105.106] 突然ですが LinuxでNASMを勉強しようとしているのですが、プログラムの書き方がまったく分かりません。TK85でアセンブルをしたことはありますが。PCでやったことがないのでまったくわかりません。 何かよい解説書、書籍等あれば教えてください。 なべちゃん [2001/05/01 Tue 14:06:50] [202.236.152.84] 一番簡単なのは >START: >in al, 60h >cmp al, 01h; ESCキー >jne START このループに入る前にキー割り込みをマスクしてしまうことですが。 (マスクをとかないで終了したり、その部分をディバガでおいかけると とまりますけど) : |
e-mail: mist@e-net.or.jp | Structured Anchor Tree Return to Menu Return to Parent Menu |
Powered by Unit Missing Link. |