11−15日目 - naskをLinuxで使えるようにする 2016/03/28, 30, 31, 4/1, 3

naskをLinuxで使えるようにする

続きです。デバッグ作業を続けます。

20GOというファイルのセットについて

20GOの中にあるファイルの中身を精査して、自分なりに注釈をつけた。

  • これらのファイルはgo_00202/go_0020oで配布されたものから取得している。これらはmingw gcc-3.2から作られた。
  • それ故にこれらのソースコードはまずgcc-3.2ベースでビルドされ、それができたらセルフブートストラップされていたはずである。
  • 要は河合氏はmingw-gccを少し改造してgoというライブラリ群を作りたかったと思われる。

ファイル一覧

  • リポジトリに入れるべきでないものもいろいろ含んでいる
  • 見るべきファイルは'*'で印をつけた
  •   config         : mingw gcc-3.2 からコピーされた(ビルド用の)コンフィグファイル
      copying		 : GPL-2 文書
      cp			 : mingw gcc-3.2 と改変されたそれの差分
      drv_osa		 :
      drv_stdc	     :
      drv_w32		 :
      funcs		     : 分割コンパイル用のソースコード(良い方法とは全く言えない)
      gcc			 : mingw gcc-3.2のメインソースコード
      golibc		 : Osaskのためのライブラリ
    * include		 : インクルードファイル
      intl		     : mingw gcc-3.2からコピーされたファイル
    * libgo		     : Osaskのためのライブラリ(だいたいがC言語の基本関数の上書き、関数には'GO_'というプレフィックスがつく)
      libiberty	     : mingw gcc-3.2からコピーされたファイル
      libmingw	     : mingw gcc-3.2からコピーされたファイル
    * libnask		 : naskに使われるライブラリ(nasklibから名称変更した、zlibは特殊な例外なので真似しない)
    * omake		     : addcrというツール
      osask.mk	     : Makefile、これはautomakeを使わない場合に必要だろう
    * readme.txt	 : 情報はだいたいここから取得
      setmode.bat	 :
    * toolstdc	     : `tolset` として配布されてるもの
      toolw32		 : ?
      w32clibc	     : ?
    		  

    その他の修正

    その他の修正

    nask内部のポインタの扱い方

  • あるポインタAとそれを保持する配列Bを宣言しておく
  • AにBのあるポインタを割り付ける
  • Aはインクリメントや(たまに)デクリメントを行いBで保持されたメモリ内を走り回る
  • コード内の命名基準がひどいため、リネームをいろいろしていきたい

  • スマートポインタを使った場合の書き換え方を示す、これによりfree不要になる。
  • 
    # 旧コード
    UCHAR buf[2 * 8], *bp; /* bufは適当にmallocした方がいいかも */
    ...
    bp = buf;
    
    # 新コード:bufをunique_ptrで初期化しておき、bpはそのポインタとして使用する
    std::unique_ptr<UCHAR[]> buf(new UCHAR[2 * 8]);
    nask32bitInt* bp;
    bp = buf.get();
    		  

    ビルド時フラグ指定でデバッグログが出力されるように調整した。もう少し時間をとって、バイナリを吐けるようにする必要がある。

    $ ./nask data/01_nasfile.nas
    main(): nask argc: 2, argv:{./nask, data/01_nasfile.nas, }
    before_nask_process(): GOLD_getsize(file): 64
    before_nask_process(): call nask...
    nask(): nask assembly source ===
    ; test for DB
    DB 0xeb, 0x4e, 0x90, 0x48, 0x45, 0x4c, 0x4c, 0x4f
    ===
    nask(): processing assembly source: because of 'src0 < src1'
    nask(): buffered pointer bp: 819091a8
    decoder(): in
    decoder(): *src == ';': semi-colon is used for comments
    put4b(): returned p[0-3]: 0x0f, 0x00, 0x00, 0x00
    put4b(): returned p[0-3]: 0x3b, 0x00, 0x00, 0x00
    nask(): processing assembly source: because of 'src0 < src1'
    nask(): buffered pointer bp: 819091a8
    decoder(): in
    decoder(): research: normal format assembly
    decoder(): found mnemonic! opcode: DB
    decoder(): found mnemonic! param: 0x48
    decoder(): found mnemonic! param: 0x01
    decoder(): found mnemonic! param: 0x9e
    decoder(): itp's first parameter: 0x48
    put4b(): returned p[0-3]: 0x31, 0x00, 0x00, 0x00
    put4b(): returned p[0-3]: 0x44, 0x00, 0x00, 0x00
    nask(): itp-param: OPE_DB
    put4b(): returned p[0-3]: 0x00, 0x00, 0x00, 0x00
    put4b(): returned p[0-3]: 0x00, 0x00, 0x00, 0x00
    nask(): dest0: (null)
    before_nask_process(): nask processed list size: 8
    before_nask_process(): call LL...
    before_nask_process(): LL processed list size: 8
    before_nask_process(): call output...
    Segmentation fault