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(/(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 | 連想配列 | ラベルリスト.各ラベルのアドレスを保存 |
最終更新時間:2008年09月20日 13時01分50秒