前々回のブログまでの マシン語プログラム実験の続編として、
実際にプログラムを暴走させたらどうなるかを試してみよう。
暴走させる最も簡単な方法は、CPUにHOLTをかけること。
そうすると、基本的にCPUの動作を停止してしまうので
プログラムとしては反応しなくなり、リセット以外の道は
なくなるはずである。
では、実際に実験してみる。
80x86系CPUにおける「HLT」命令の 16進コードは「F4」である。
前回のように Windows用バイナリエディタ
「
Stirling(スターリング)」
を起動して、そこに「F4」と入力する。
これを適当なディレクトリに「HLT.com」というファイル名でセーブする。
このファイルをDOS窓のプロンプトからタイプして実行してみる。
案の定、DOS窓は何も反応しなくなった。
この実験は Windows 2000 上で行ったのだが、
当たり前のことではあるが最近のOSはさすがで、
当の DOS窓 はハングしてしまったが、ウィンドウズ自身は
全く問題なく動作していた。
これを実際のMS-DOSの上で実行したら、PC自身をリセットするしかない。
自分が PC-9801上で8086アセンブラのソフト開発していた頃には、
果たして何度 リセットボタンを押したことか、と昔を思い出してしまった。
カテゴリー:
プログラミング
22:16
| コメント (0)
| トラックバック (0)
この日のニュースレター編集会議では、
来週3月8日から始まる第5回JTPAシリコンバレーツアー直前ということもあり、
最終打ち合わせとなった。
ツアーのスケジュールを見直し、微妙な時間の変更、
情報漏れのチェック、スタッフ間の連絡方法の確認などを行った。
今回のツアーで昨年との違いのひとつは
セミナールームでの椅子の配置。
これについては以前のブログ
「
Banquet, Classroom, Theater」
で解説しているが、
昨年までは いわゆる「クラスルーム(Classroom)」という
学校の教室のように四角い長机に椅子をつけていた。
これだとセミナー参加者がメモをとったりしやすい反面、
後ろの方だと、講演者からの距離が遠くなってしまう、
というデメリットがあった。
そのため今回は、参加者とパネラーとの距離感を
もっとなくそうということで、
机をなくした いわゆる「シアター(Theater)」形式とすることにした。
また今回のツアー中の土曜日(3月10日)には、
ツアー参加者のレセプションを兼ねて、
渡辺千賀さんの「ヒューマン2.0」出版記念パーティーが予定されている。
皆さん、そちらにも是非お越しください。
【参考リンク】
カテゴリー:
JTPA
22:19
| コメント (0)
| トラックバック (0)
最近、せっかく アセンブラをやってきているので、
もう少しだけ、変更してみる。
前回のブログの最後に示した アセンブラのソースでは
単に「mov」命令を使っているだけで、
それでは能がないので、
4行目の「mov dl, 73h」を「or dl, 20h」と変更してみる。
「
ASCII文字コード」を見てみると判るが、
アルファベットの大文字と小文字は、コードで 20h の差があることがわかる。
大文字を小文字に変換するためには コードで 20h を足す、
つまり、00100000B を or してやればよいことになる。
これで、1行目に設定した文字を小文字に変更することがきる。
すると アセンブラのソースは
mov dl, 53h ; 「S」の字の ASCII文字コード を DLレジスタにセット
mov ah, 02h ; 出力に1文字出力するファンクションコールを指定
int 21h ; MS-DOSファンクションコール
or dl, 20h ; dlの文字を小文字に変換
int 21h ; MS-DOSファンクションコール
int 20h ; プログラムの終了
となる。
「or dl, 20h」はコードにすると「80, CA, 20」となるので、
コード全体としては、
「B2, 53, B4, 02, CD, 21, 80, CA, 20, CD, 21, CD, 20」
となる。
これを実行してみるとうまくゆくが、
結局、実行結果は前回と全く変わらないことになる。
試しに、2バイト目の値を「J」を表す「4A」に変更してから
実行してみると、結果は
Jj
となる。
ただし、この方法だと、最初に設定した文字が小文字なら、
そのまま小文字が2回続けて表示されることになる。
それではつまらないので、もし小文字を設定した場合には
小文字と大文字が表示されるようにしてみる。
これは、4行目の「or dl, 20h」を
「xor dl, 20h」に変更するとよい。
コードとしては、「80, F2, 20」となるので、
コード全体としては、
「B2, 53, B4, 02, CD, 21, 80, F2, 20, CD, 21, CD, 20」
となる。
これを実行すると、
大文字の場合はその小文字が、小文字の場合は大文字が続けて表示されるようになる。
ここ何回かのブログでウィンドウズ・ユーザーが
マシン語を体験できる方法を紹介してみたが、
これ以上複雑なことを マシン語でプログラムしようと思ったら
ハンド・アセンブルではなく、素直にアセンブラ・ソフトウェアに
任せた方がよいであろう。
【参考リンク】
カテゴリー:
プログラミング
22:47
| コメント (0)
| トラックバック (0)
前回のブログで マシン語プログラムを
実行するところまできたので、
今回はこのプログラムを少し改造してみよう。
まず、前回のブログで実行したプログラムのソースは
mov dl, 53h ; 「S」の字の ASCII文字コード を DLレジスタにセット
mov ah, 02h ; 出力に1文字出力するファンクションコールを指定
int 21h ; MS-DOSファンクションコール
int 20h ; プログラムの終了
で、これをハンド・アセンブルして16進数のコードしたのが
「B2, 53, B4, 02, CD, 21, CD, 20」
であった。
このコードの2バイト目の「53」が表示される文字のコードなので
ここを他のコードに変更すると表示される文字を変えられる。
「
ASCII文字コード」から
適当な文字のコードを探してみるとよい。
例えば、「53」から「73」に変更して
「B2, 73, B4, 02, CD, 21, CD, 20」
としてから、実行してみると
表示される文字が小文字の「s」になる。
では、もう少し改良を加えて、文字を2文字表示するようにしてみる。
mov dl, 53h ; 「S」の字の ASCII文字コード を DLレジスタにセット
mov ah, 02h ; 出力に1文字出力するファンクションコールを指定
int 21h ; MS-DOSファンクションコール
mov dl, 73h ; 「s」の字の ASCII文字コード を DLレジスタにセット
int 21h ; MS-DOSファンクションコール
int 20h ; プログラムの終了
上の例では1文字目が「S」、2文字目が小文字の「s」を表示している。
これをコードにしてみると、
「B2, 53, B4, 02, CD, 21, B2, 73, CD, 21, CD, 20」
となる。これを例のごとく
バイナリ・エディターで入力してから「disp2.com」という名前を付けて
保存後、実行してみると、
C:\TEST>disp2
Ss
C:\TEST>
となる。
【参考リンク】
カテゴリー:
プログラミング
22:14
| コメント (0)
| トラックバック (0)
前々回のブログで、
実験用のアセンブラを
ハンド・アセンブルしてマシン語コードに
するところまで来ていたので、今回はその続きとして、
そのコードをファイルにして、実際に実行してみることにする。
まず、コードをファイル化するために、
以前のブログ
『
バイナリ・エディター「Stirling(スターリング)」』
で紹介した
Windows用バイナリエディタ
「
Stirling(スターリング)」
を使う。
そこで、新規ファイルを開いて、
マシン語コード「B2, 53, B4, 02, CD, 21, CD, 20」
を順番に打ち込んで行く。
入力が終了したら、
適当なディレクトリにファイルをセーブする。
ここでは、ファイル名を「disp1.com」としておこう。
ウィンドウズ上で、この手のプログラムを
実行するためには拡張子を「.com」とする必要がある。
さて、準備が完了したので、実際に実行してみよう。
ウィンドウズからコマンド・プロンプトを起動して、
それから 先ほどのファイル「disp1.com」を保存した
ディレクトリへ「CD」コマンドで移動する。
例えば、デイレクトリ「C:\TEST」に移動するのであれば
cd C:\TEST
とする。
そこで、単に、「disp1」とタイプしてからリターンキーを打てば
C:\TEST>disp1
S
C:\TEST>
のように、今回作成したマシン語プログラムが実行され、
アルファベット大文字の「S」が表示されてから
無事にプロンプトが戻ってくるハズだ。
たかが 文字を1文字 表示するだけのプログラムではあるが、
自分でマシン語を直接打ち込んだプログラムが
きちんと動作してくれるとなんとも言えず嬉しいものだ。
【参考リンク】
カテゴリー:
プログラミング
22:52
| コメント (0)
| トラックバック (0)
来月3月に第5回JTPAシリコンバレーツアーが開催される。
既に、日本全国からの20名の参加者が選考され
Mixi や その他のメディアを駆使して
参加者間のコミュニケーションを図っている。
しかし、いくらインターネットが普及した時代となっても
究極のコミュニケーションは実際に会ってみることだ。
mixiの掲示板をみてみると、
関東地区とか関西地区とかで それぞれ
ツアー参加者どうしのミーティングを何度か計画している。
ツアーをより実り多きものにするためには大切なことだと思う。
そこで、関東地区の第2回ミーティングが行われる際に
Skypeでの参加をお願いした。
簡単な挨拶を終えた後、私はずっと発言をしない(ミュートしていた)で
現場のお話を聞かせていただいた。
集まられた方々の日ごろの活動について語り合っておられた。
わたしとしては日本の優秀な若い方々の貴重な生の声が聞けて
大変に楽しかった。
しばらく後、参加者の方々からの質問をお受けすることにした。
質問の内容としては、
ツアー開催までに何を予習しておいたらよいか、とか、
シリコンバレーの気候について、とか、
事前にこちらに来られる方からサンフランシスコ近辺の交通網について、
等であった。
私の経験上、過去の JTPAツアーとか、鹿児島大学ツアーとかの
エピソードを交えて、それぞれの質問にお答えさせていただいた。
以前のブログ
「
スカイプ(Skype)で ツアー参加学生との会議」とか
「
第3回鹿児島大学シリコンバレー研修ツアーの 顔合わせの会」でも書いたとおり、
こうやって、 シリコンバレーツアー参加者の方々と
事前に、電話代も気にせずにお話が出来るというのは
本当にいい時代になったものだ。
カテゴリー:
JTPA
22:37
| コメント (0)
| トラックバック (0)
知り合いの方からマシン語についてのご質問を頂いたので、
一種のデモンストレーションとして
8086のマシン語をハンド・アセンブルしてみることにする。
但し、複雑なプログラムは大変なので、
最低限 マシン語が動作していることがわかるレベル、
ということで事前に指定した一文字を画面に表示させるプログラムを作ってみる。
たった 一文字の表示であっても、
OSやBIOSに頼らず、全てをマシン語で組むのは非常に大変なので、
ここでは、安直にMS-DOSファンクションコールを呼ぶこととしよう。
これであればWindowsのコマンド・プロンプト画面、いわゆる「DOS窓」の中で実行できるハズだし、
もし、暴走してしまっても、その「DOS窓」を強制終了させれば、
Windows自体をリセットする必要もない。
ここでは、
「
MS-DOS MASM プログラミング入門」
のページに MS-DOSファンクションコールについての解説があるのでそれを参考にしてみる。
これによると、出力に1文字出力するファンクションコールは、
「AH = 02H : DL = 出力する文字コード」となっている。
この情報をもとに
アセンブラで記述してみると以下の4行になる。
mov dl, 53h ; 「S」の字の ASCII文字コード を DLレジスタにセット
mov ah, 02h ; 出力に1文字出力するファンクションコールを指定
int 21h ; MS-DOSファンクションコール
int 20h ; プログラムの終了
これをIntel の 80x86系CPUのオペコード・テーブルを使って
16進数に変換してみる。
まず、1行目の「mov dl, 53h」について。
DL レジスタに1バイトの値をセットするオペコードは「B2」で、
それに引き続き、セットしたい1バイトの値が来る。
この例では、大文字の「S」の字を表示することとして、
そのASCIIコードである 53h が来ることになる。
よって、「mov dl, 53h」の行は16進コードの「B2, 53」となる。
同様に、2行目の「mov ah, 02h」の
オペコードは「B4」で、このコードに引き続き、
出力に1文字出力する MS-DOSファンクションコール を表す
「02h」をセットする。
よって、「mov ah, 02h」の行は16進コード「B4, 02」となる。
それからファンクションコールを実行する
ソフトウェア割り込みである「int」命令のコードは「CD」であり、
直後に割り込み番号を1バイトで指定する。
MS-DOSファンクションリクエストの割り込み番号は「21」なので
「int 21h」はコード「CD, 21」となり、
その直後の、プログラムの終了を意味する
「int 20h 」がコード「CD, 20」となる。
これらを全てつなげてみると
「B2, 53, B4, 02, CD, 21, CD, 20」
となる。
では、実際の実行方法については次回のブログへの続きとしよう。
【参考リンク】
カテゴリー:
プログラミング
22:50
| コメント (0)
| トラックバック (0)