トップ 一覧 検索 ヘルプ RSS ログイン

tinyasmの変更点

  • 追加された行はこのように表示されます。
  • 削除された行はこのように表示されます。
!!!アセンブラ
TINYCPUをターゲットとするアセンブラTINYASM

!!ソースコード
 #!/usr/bin/perl -W
 
 %MCODE = (HALT=>0x0000,
          PUSHI=>0x1000,
          PUSH=>0x2000,
          POP=>0x3000,
          JMP=>0x4000,
          JZ=>0x5000,
          JNZ=>0x6000,
          IN=>0xD000,
          OUT=>0xE000,
          ADD=>0xF000,
          SUB=>0xF001,
          MUL=>0xF002,
          SHL=>0xF003,
          SHR=>0xF004,
          BAND=>0xF005,
          BOR=>0xF006,
          BXOR=>0xF007,
          AND=>0xF008,
          OR=>0xF009,
          EQ=>0xF00A,
          NE=>0xF00B,
          GE=>0xF00c,
          LE=>0xF00D,
          GT=>0xF00E,
          LT=>0xF00F,
          NEG=>0xF010,
          BNOT=>0xF011,
          NOT=>0xF012);
 
 $addr=0;
 while(<>){
     push(@source,$_);
     if(/(\w+):/){
        $label{$1}=$addr;
        s/\w+://;
     }
     if(/-?\d+|[A-Z]+/){
        $addr++;
     }
 }
 
 print "*** LABEL LIST ***\n";
 foreach $l (sort(keys(%label))){
     printf "%-8s%03X\n",$l,$label{$l};
 }
 
 $addr=0;
 print "\n*** MACHINE PROGRAM ***\n";
 foreach (@source){
     $line = $_;
     s/\w+://;
     if(/PUSHI\s+(-?\d+)/){
        printf "%03X:%04X\t$line",$addr++,$MCODE{PUSHI}+($1&0xfff);
     } elsif(/(PUSHI|PUSH|POP|JMP|JZ|JNZ)\s+(\w+)/){
     } elsif(/(PUSH|POP|JMP|JZ|JNZ)\s+(\w+)/){
        printf "%03X:%04X\t$line",$addr++,$MCODE{$1}+$label{$2};
     }elsif(/(-?\d+)/){
        printf "%03X:%04X\t$line",$addr++,$1&0xffff;
     } elsif(/([A-Z]+)/){
        printf "%03X:%04X\t$line",$addr++,$MCODE{$1};
     } else {
        print "\t\t$line";
     }
 }

!!変数など
,変数名,タイプ, 
,%MCODE,連想配列,ニーモニックを機械語コードに変換
,$addr,スカラー変数,現在処理している行の対応するアドレス
,@source,リスト,入力されるソースコードを2回目のパスのために保存
,%label,連想配列,ラベルリスト.各ラベルのアドレスを保存