ぼんさい塾

ぼんさいノートと補遺に関する素材や注釈です.ミスが多いので初稿から1週間を経た重要な修正のみ最終更新日を残しています.

L8プログラミング (7)

2013-07-28 23:18:13 | 暮らし
IT.pdf
IT-s.pdf
IT-e.pdf

記事一覧
 
          ジャンプテーブルによる分岐
       (2013-08-31:ジャンプ命令を訂正)

IT-e.pdf に switch 文に関する説明を追加しました.アセンブラを使ったことのない人には if-else 文も switch 文も実態は似たようなものだと思っているかもしれませんが,少なくとも本来の用法(※)ではコンパイルの仕方が全然違います.
※ 「本来の用法」は単なる推測ですが,break 文がなければフォールスルーが起こると言うのは [#18%35] の「RET」を「NOP」で置換したときの現象を想像させます.

メモ:次の資料を引用しています
[1] カーニハン&リッチー,プログラミング言語C 第2版 ANSI規格準拠
  http://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9EC-%E7%AC%AC2%E7%89%88-ANSI%E8%A6%8F%E6%A0%BC%E6%BA%96%E6%8B%A0-B-W-%E3%82%AB%E3%83%BC%E3%83%8B%E3%83%8F%E3%83%B3/dp/4320026926
[2] switch文 - Wikipedia
  http://ja.wikipedia.org/wiki/Switch%E6%96%87
[3] case文(switch文)の実装
  http://www.tokumaru.org/memo/memo002.htm
  初期のCabezonは、以下の三種類のコードの中から、メモリ使用量が最も少ないコードを・・・
[4] Chapter 1 : C/C++に於けるジャンプテーブルの実装に関する考察 (2001 ...
  http://gigo.retrogames.com/t_lab/chapter1.html
  アセンブラのように ・・・jmp dword ptr [cur_tbl+op_code*4] のような実装は出来ず、(vs [3])
-----
(1) [1]の A9.4 選択文に「この制御式は整数格上げ(A6.1節)を受け,case 定数は格上げされた型へ変換される」と書かれているだけですが,case 定数の取りうる範囲が狭く,ジャンプテーブルを使って即座にジャンプするのが本来の用法です.だだし,switch 文はソースを読み易いので多くの言語で使われ,C# のように文字列まで許すこともあるので実装の仕方が多様化しているようです[2][3].
(2) 初期のマイクロコンピュータのアセンブリ言語で書かれたモニタプログラムではコンソールから入力するコマンドを D(dump),G(go)のように1文字で表わし,後に引数を付けていました --- A から Z に対応する 26行 のジャンプテーブルを使用.
(3) IT-e.pdf [#18%35] のジャンプテーブルはCの関数へのポインタの配列に対応していますが,関数へのポインタの使い方の説明は省略します --- 興味のある人は[1] 5.11 等を見てください.