• ベストアンサー

command.comとASCIIコードについて

command.comとASCIIコードについて質問させて下さい。 もし御存じであれば以下について御回答いただけないでしょうか。 例えば、 キーボード上「 あ」・「 い」・「 う」・「 え」・「BS」・「 ←」というキーがあり そしてそれに対応するASCIIコードが それに対応して「a1」・「a2」・「a3」・「a4」・「b1」・「b2」となっていたとします。 その時、「あ・い・う」というコマンドを入れたかった場合に 「え・い・う」と間違えて入力してしまった場合、command.comにはENTERが押された時点で「a4・a2・a3」という命令がされることになるのですか? その後で、「a1・a2・a3」に直したいとき「BS」で戻るというのは「BS」の「b1」というコードが 「a4・a2・a3・b1」と入るわけではなく、直接command.comの入力用バッファが 「a4・a2」となってしまうということになるのでしょうか? それとも、やはり「a4・a2・a3・b1」となっているんだけどディスプレイ上「え・い」となっているということなのでしょうか? それに対して「 ←」キーは異なる動作をするということなのですか? それとも、もともと「b2」というコードはなくて「 ←」と入力されたときは 「BS」と入力されたものと同じ処理をするということになるのでしょうか? 質問の意図が取りにくいかとは思うのですが、是非お答いただけたらと思います。どうか宜しくお願いします。

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

  • ベストアンサー
  • nuts
  • ベストアンサー率36% (141/389)
回答No.5

そろそろ「自信なし」の回答になってきます。 まずアセンブラの概念ですね。アセンブラ(というのはプログラムの名前なので、厳密にはアセンブリ言語)は、CPUやメモリを直接操作します。それに対してコンパイラで使うCやJavaなどの高級言語は、メモリなどを抽象化したものを扱います。 具体的にたとえば、文字列の操作をするとき、高級言語では名前をつけた文字列変数を用意して、文字列削除の命令で何番めの文字を削除、という操作をするのですが、アセンブリ言語ではメモリのx1番地からx4番地までを文字列の領域として使う、3文字めを削除するときはx3番地をクリアする、といった操作をプログラム自体に指定します。高級言語でも最終的にやっていることは同じなのですが、高級言語のプログラムソースを見ていても、こうしたことはわかりません。 (実際には、シンプルなC言語での文字列処理はメモリの直接操作に近い方法ですし、アセンブリ言語でもマクロアセンブラを使えばかなり抽象化できますが、とりあえずここでは概念の話です)。 このへんはまさしく「概念」なので、これがわかったからといって実際のアセンブリ言語でのプログラミングには結びつきません(わたしも実はできません)。ただ、最終的にコンピュータの中でこうした仕組みが働いている、と理解しておけば、もちろんアセンブリプログラミングの第一歩になりますし、高級言語のプログラミングや、単に利用する上だけでも、有効なのではないかと思います。 io.sysは、本来のMS-DOSでは、外部入出力(I/O、input/output)とCPUを繋ぐ働きをします。command.comなどからの「この文字を表示しろ」という命令(ファンクションコール)をmsdos.sysが解釈し、それをio.sysが実際のVRAM(表示用のメモリ)の番地に変換して書き込む、といった作業を行っていたはずです。もっとも最近のWindowsでは、msdos.sysは単に以前との互換性のために残されているだけで、io.sysがファンクションコールの処理から行っているような気配ですね。 うーん、このへんは思いっきり「自信なし」です。どなたか補足を……。

masahiro_chi
質問者

お礼

御回答ありがとうございました。 本当に参考になりました。 御厚意に感謝いたします。

その他の回答 (4)

  • nuts
  • ベストアンサー率36% (141/389)
回答No.4

質問の履歴を見ると、だいぶお困りのようですね……。 これについては、入力バッファがどういう構造のメモリであるかを考えるのが近道だと思います。アセンブラそのものの知識は必要ないですが、その基礎になっている概念が必要だ、ということでしょう。 まず、command.comは入力バッファというメモリ領域を用意しています。メモリには(この場合は)1バイト単位で番地が割り振られ、直線上に並んでいると考えることができます。仮にx1,x2,x3,x4...としましょう。また、画面表示用のメモリ領域(内容がそのまま画面に反映される)もあり、これをv1,v2,v3,v4...とします。 質問の例では、x1にa4,x2にa2,x3にa3と、入力された文字を順に格納していき、それがふつうの文字コードなら、そのままv1~v3にコピーして画面上に表示させます。BSまたは←キーを押したとき、x4にいったんコードb1が格納されますが、これは前削除のコードなので、command.comのプログラムがb1を解釈し、x3ひいてはv3をクリアします。もちろんx4に格納されていたb1自体もクリアされます。x4をv4に反映する前にこの処理を行うわけです。(まとめてcommand.comと書きましたが、v1~に反映させるのはio.sysあたりの仕事かもしれません。あいまいな回答ですみませんが)。 素のcommand.comのバッファエディタは、これだけの(x1~に格納されたコードを解釈し、反映させる)作業しかしません。他に、ふつうのキーではEnterとBreakの解釈をするぐらいです。ctrl-H,ctrl-M,crtl-C,ctrl-J,ctrl-Eなどの動作も試してみてください。上記以外がどうなるかは細かく覚えていませんが(^_^;(ctrl-Pとctrl-Nはプリンタ関係なので、下手に触るとハングアップするかもしれないので気をつけて)。 もともとcommand.comの動作はテレタイプを真似たVT-52やVT-100という規格に基づいています。このへんのキーワードも調べてみると面白いかもしれません。新刊書店で参考書を見つけることが難しいようだったら、専門の古書店に当たってみてはどうでしょう。東京なら神保町に、理工学書専門の古書店がいくつかあったと思います。

masahiro_chi
質問者

お礼

御回答頂きまして誠にありがとうございます。 御丁寧に教えていただきまして、非常に感謝しております。 入力バッファ領域と画面表示用の領域が別にあるのですか。 そのあたりが私の中で整理がついていませんでした。 おかげさまで何とか宿題の回答を作成することが出来そうです。 ただ、少しだけ御回答いただいたものの中で気になるところがありまして、 しつこくて大変恐縮なのですが、なんとか再度御回答いただけないでしょうか。 ここにいわれるアセンブラの基礎概念とはどういったものなのでしょうか? また、io.sysとは基本的にどういう働きをするものなのでしょうか。 本当に申し訳なく思いますが、是非よろしくお願いいたします。

  • bluesky
  • ベストアンサー率33% (3/9)
回答No.3

先ほどの回答に補足します COMMAND・COMといってもどれくらいの範囲でしょうか というのはDOS起動時におそらくMS-DOS・SYSと IO・SYSというファイルが読み込まれると思われるので プロンプトの制御ルーチンがここに記述されている可能性はあります masahiro_chi さんが何をやらんとされているのか教えていただければ もうすこし具体的に回答できるのですが・・・

masahiro_chi
質問者

お礼

御回答いただきまして誠にありがとうございます。 io.sysファイルというものもあるのですか。 大変参考になりました。 私が何をしようとしているかと言いますと 数日前に「MS-DOSについて」と言う質問をさせていただきまして 皆様の御回答を拝見させていただくうちに このような質問に至りました。 御親切にありがとうございました。

  • bluesky
  • ベストアンサー率33% (3/9)
回答No.2

質問の回答のお礼の回答(・・・?)です > > 後者の「a4・a2」が正解です。 > > > とのことなのですが、一度は「b1」をcommand.comが認識して > 「a3」を消すことになるのでしょうか? > それとも何か他に制御しているものがあるということなのでしょうか? command・comを解剖したわけではないので100%ではありませんが 99%command・comがやっているでしょう 私が調べた範囲でですがPC-98シリーズもDOS/V機も そういった機能をもつBIOSサービスルーチンはありませんでした ・・・となると後はcommand・comがやっているしか考えられません

masahiro_chi
質問者

お礼

なるほど。 概要が分かってきました。 御回答いただきましてありがとうございました。

  • bluesky
  • ベストアンサー率33% (3/9)
回答No.1

えーと MS-DOSに関してでしたら > 「え・い・う」と間違えて入力してしまった場合、command.com にはENTERが > 押された時点で「a4・a2・a3」という命令がされることになるのですか? そのとおりです。 > その後で、「a1・a2・a3」に直したいとき「BS」で戻るというのは > 「BS」の「b1」というコードが「a4・a2・a3・b1」と入るわけではなく > 直接command.comの入力用バッファが 「a4・a2」となってしまう > ということになるのでしょうか? 後者の「a4・a2」が正解です。 > それに対して「 ←」キーは異なる動作をするということなのですか? > それとも、もともと「b2」というコードはなくて「 ←」と > 入力されたときは「BS」と入力されたものと同じ処理をするということに > なるのでしょうか? これについてはPC-98シリーズMS-DOSに限って言えば BSキーと←キーのキーコードは同一 したがって同一の動作をします DOS/VのMS-DOSやWin95のプロンプトではどうだったかは・・・

masahiro_chi
質問者

お礼

御回答ありがとうございます。 質問事項が抜けていたのですね。 その通りMS-DOSに関しての質問でした。 申し訳ありません。 >後者の「a4・a2」が正解です。 > とのことなのですが、一度は「b1」をcommand.comが認識して 「a3」を消すことになるのでしょうか? それとも何か他に制御しているものがあるということなのでしょうか? もしお分かりでしたら教えていただけないでしょうか。 宜しくお願いいたします。

関連するQ&A

  • EmacsにおけるキーとASCIIコードの対応

    こんにちは。 Emacsは、Gnu Emacs for Windows 23.4 を使っています。 Emacsでは、ASCII文字は、0~127のASCIIコードで表されます。 例えば、文字Aは、ASCIIコード65で表されます。 現在、非印刷文字を表すASCIIコードに対応するキーが分からず困っています。 例えば、C-@はASCIIコード0, C-aはASCIIコード1, C-bはASCIIコード2, .....RETはASCIIコード13, TabはASCIIコード9, ESCはASCIIコード27といったことは分かっているのですが、他のASCIIコード(例えば17~26など)に対応するキーが分かりません。 非印刷文字を表すASCIIコードに対応するキーを調べる方法はあるのでしょうか? 何かいい方法を知っておられる方がいらっしゃれば、是非アドバイスを頂きたいと思います。 では、よろしくお願い致します。

  • command.comの内部動作(エディットバッファ等)と画面表示の問題について

    昨日、MS-DOSについて質問させていただいたものです。 私が質問の内容を把握していなかったために皆様に多くの御手数をおかけしましたことをお許し下さい。 昨皆様からのご回答を頂く中で私が聞きたいのはどうやらcommand.comの内部動作(エディットバッファ等)と画面表示上の問題についてということが分かりました。昨日は分かったつもりだったのですが、一晩考えたところ、よく分からない点がありまして出来ればそちらにもご回答いただきたく質問させていただけないでしょうか。どうかよろしくお願いします。質問項目は以下の通りです。 1.command.comは現在入力中の文字列のバッファを   持たないということなのですがなぜ画面表示が出来て、   しかも入力中の文字列を[ENTER]を押せば解析し   実行できるのに、バッファはしていないということになるのですか?   (直前の[ENTER]キーを押されて実行した文字列を    バッファしているということは分かりました。) 2.また、編集するには入力中の文字列バッファを持って、   現在のカーソルの位置を覚えておくという処理が必要ということも   分かったのですが、そうするとDOSKEYと入力することで   そういったバッファ領域やカーソル位置を認識する領域を初めて   確保するということになるのでしょうか?   DOSKEYの内部動作っていうのでしょうか?   出来ればそういったものを詳しく教えていただけないでしょうか。 3.それらと画面表示はまったく別物なのでしょうか? 自分がよく分かっていないので質問が的を得ていないかもしれませんが どの問いに対してでも結構です。どうかご回答のほどよろしくお願いいたします。

  • UTF-8とASCIIコードにおける互換性について

    UTF-8とASCIIはそのASCIIコードの範囲のおいて 互換性を持ちます。(と、書籍や多種な文献にはそういった記述があります) たとえば【A】という文字をUTF-8で符号化した際は【41】(16進数で) さらにASCIIコードでも【41】という値がAという文字に割り当てられています。 確かに、一件互換しているようにみえますが、UTF-8っていうことは最終的には Unicode上のコードポイントの値・・・つまり0x0041という値に復元?(というのでしょうか)するわけですよね? でそのUnicodeの文字集合上から復元したコードポイントに対応する文字を参照しAという文字をみつけてくると・・・。 これって【A】という文字をUTF-8で符号化した歳のバイト列はASCIIと一致しているけれど 結局Unicodeコードポイントに直した場合【00】という上位バイトが無駄にくっついてきて【0x0041】となり 互換性がなくなるのではとおもったのですが・・・。 これはどういう意味の互換性なのでしょうか? 識者の方ご教授ください。 お願い致します。

  • CRC(チェックサム)のASCIIコードについて

    現在装置を外部PCから操作させる設定の一覧を作成しています。 メーカーからの指定は、設定したい数値を(16進数) 40 NN NN NN CRC  をASCIIコードで入力するように指定されています。 例えば、50に設定したい場合は @050* (40 30 35 30 2A) と入力します。 ここで、CRCがASCIIの制御文字(00~1F)に該当してしまう場合、どのように CRCを設定するか分からずにいます。 このような場合は、どのような設定をするものなのでしょうか?

  • command.com上でのcmdの呼び出し

    質問です。 WindowsのDOS窓は基本的にwin上で走るエミュレータだと聞いたのですが、16bitエミュレータのcommand.com上でcmd.exeが呼び出せるのは、どういう仕組みになっているのでしょうか。 ただ、16bitエミュレータ上で32bitのエミュレータを起動したと考えれば良いとは思うのですが、心なしかcommand.com単体のときよりもcommand.com上で呼び出したcmd.exeのほうが、キー入力のエコーバックも早い用に感じます。 ネットで調べてみると、呼び出すたびに切り替えているのではという意見もありましたが、XP上で開いたcommand.comからcmd.exeを呼び出した状態でNASMでアセンブルした16bitのcomファイルが実行できるので、ただ切り替えているだけではないのではないかと疑問が消えません。 また、スタートメニューでファイル名を指定して実行するときに、16bitのcomファイルを指定すると、基本的にはcmdが立ち上がって実行され、プロンプト以外画面には何も表示されないで実行終了となるのですが、2割ほどの確率でcommand.comが立ち上がり、きちんと実行されることがあり余計に混乱しています。 どなたか詳しい方がいらっしゃったら、ご解説を宜しく御願い致します。

  • バーコードリーダー だけで Enterキーを押すことはできますか?

    バーコードリーダー だけで Enterキーを押すことはできますか? 今バーコード入力後 Tabキーが自動入力されるのですが 数個Tab付きバーコード読み取り後 最後にEnterのみを入力したいのですが Enter のみのバーコードってつくれるのでしょうか??

  • カシオのポケコン プログラム作成について

    先ほど同じ質問をしたのですが、質問の仕方が悪く意図した回答が得られなかったので、 再度質問します。 カシオのポケコン(Z-1GR)のBASICでプログラムを作成する際に Enterキーを押した場合と数値を入力した場合で分岐させたいのですが、やり方がわかりません。 例えば Aを入力、Bを入力すると、C=A+BでCの答えを表示させる。 ただし、Bの入力時に何も入力しないで、そのままEnterキーを押すと、C=0と表示させる と言った感じです 10 INPUT"A=",A 20 INPUT"B=",B 30 IF B="" THEN GOTO 40 ELSE GOTO 50 40 PRINT"C=0":GOTO 20 50 C=A+B 60 PRINT"C=";C:GOTO 20 上のライン30の指示がうまく実行しません。 「B="" THEN GOTO 40」の部分だと思うのですが この部分 (そのままEnterキーを押すとライン40に進む)をどのようにすればよいか 教えてください。 どなたかわかる方いらっしゃいませんか?

  • ASCIIコードへの変換方法

    ポインタに文字列を格納し char *a="a"; char *b="ace"; このポインタの中身をASCIIコードで表示させるプログラム ポインタaの中身aはASCIIコード8進数で001です。 ポインタbの中身aceはASCIIコード8進数で001003005です。 という感じのプログラムを作りたいのですが ASCIIへの変換方法がわからなく困っています。 もしよろしかったら具体例等のプログラムのご教授願います。

  • ダメだ・・・分からない。while文 無限ループ&’\n’エンター後無限ループ脱出

    忙しい中失礼します。 C言語超初心者のものです。while文での表示について質問があります。 下記の’プログラム内容’はEnterキーが押されるまで、 ’k’入力後 → Enterキー → ASCII value of k is 107.  ’t’入力後 → Enterキー → ASCII value of t is 116. ・・・ のように継続させ、 何もアルファベットを記入せず、’Enterキー’のみを押した場合はループから抜け、DOS画面を終了するようにしたいのですが、それが出来ません・・・。 ’k’入力後Enterキーを押すと、’Enter a character:’の表示がなされた後、’Press any key to continue・・・’となり画面を閉じなければいけなくなります。 while文の中の()内を何とかすれば、思い通りのプログラムになる、とは思うのですが、それが考え付きません。 申し訳ありませんが、よろしければそのヒントを下さい。多分すごく簡単なことだとは思うのですが、それが出来ません。 ※私個人の考えとしては、while文の中の(scanf("%c", &ch)&&(ch!='\n'))において、’&&(ch!='\n')’をプログラム文からなくせば、Enterキーを押さない限り(’k’入力後のEnterキー除く)、何度もパソコン側から尋ねられると思ったのですが・・・。・・・うまくいかず。 プログラミング内容: #include <stdio.h> #include <stdlib.h> int main() { char ch; printf("Enter a character:\n"); while(scanf("%c", &ch)&&(ch!='\n')) { printf("ASCII value of %c is %d.\n\n", ch, ch); printf("Enter a character:\n"); } system("PAUSE"); return 0; }

  • Excel でASCII文字列を16進コードへ変換

    Excel でA1セルに、 A1セル:”1234” という半角英字の文字列が入力されています。 これをすべてASCIIコードへ変換したいのですが、 何か方法はありますでしょうか? 結果は、 A2セル:”49505152” となることを想定しています。 私なりに調べたのですが、 =CODE(MID(A1,1,1)) & CODE(MID(A1,2,1)) & CODE(MID(A1,3,1)) & CODE(MID(A1,4,1)) なら、期待した結果になっておりましたが、 文字数が多い場合にかなり不効率でした。 他の方法をご教授ください。