21ー24日目 - RESBオペコードの修正 2016/4/12-15

RESBオペコードの修正

RESBオペコードを使うと、naskは指定したバイト数だけ0x00で埋めてくれます

主な実装部分は20GO/nasklib/nask.c#L2379 にあります。

  • naskは'RESB'コマンドを見つけると、中間コードに'0x59'を混ぜ込みます
  • その結果、バッファされたポインタを書き込む時にこのコードに到達します
  • マイクロコードとは?

    マイクロコード から引用

    ところで、「アセンブラ言語」で書かれたコードは「機械語」 (マシン語)に翻訳されます。 この「機械語」がプロセッサが理解する最終形なのでしょうか? 実は機械語は更に細かい命令に分断されます。 これはソフトウェア開発者が意識する必要は全くありませんが、 知識として知っておくと良いと思います。 機械語というのは、プロセッサに取り込まれた後に、更に細か な命令に分けられます。 何故、機械語よりも細かな命令に分断しなければならないのか というと、細かな命令に分断する事により、プロセッサ内部で の処理が「簡略化」出来るからです。 簡略化出来ると何か良い事があるのでしょうか? プロセッサ内部での処理を簡略化する事により、1つ1つの命 令の「処理を速くする」事が出来るようになります。 つまり、1つ1つの命令を小さく、単純化する事により、それ ぞれの処理を単純化(=高速化)出来るのです。 勿論、命令を細かな物に分断してしまうので、命令数は増えて しまいます。 しかし、1つ1つの命令が単純なので、より高速に行なえる命 令を先に実行したり、複数の命令を同時に実行したりする等の 工夫をする事が出来るようになります。 これらの、より高速に処理が行なえるようにする工夫や仕組み の事を「マイクロアーキテクチャ」といいます。 この言葉はコンピュータ雑誌等で見かけた事がある方もいらっ しゃるかもしれません。 また、1つ1つの細かな命令群の事を「マイクロコード」とい います。

    見た感じ

  • buf[j++]にて、bufに入っている長さ情報をdestに入れている
  • (1) たぶん'len'にあたるものが 'RESB 16' などと入力した際の 16 にあたると思うのですが…
  • (2) その後何らかの繰り返し表現が出力されている
  • 		if (c == 0x59) {
    			/* TIMES microcode */
    			dest0[0] = 0x59;
    			s = ifdef->expr[8];
    			k = ifdef->dat[8];
    			if (dest0 + len + k + 4 > dest1)
    				dest0 = NULL;
    			if (dest0 == NULL)
    				goto fin;
    			put4b(-1, dest0 + 1); /* 長さ不定 */
    			dest0 += 5;
    			c = 5; /* len出力 */
    			do {
    				*dest0++ = buf[j++]; // (1)
    			} while (--c);
    			do {
    				*dest0++ = *s++; // (2)
    			} while (--k);
    			continue;
    		}