Created
December 7, 2014 01:57
-
-
Save kusabanachi/d0247c6495497c296bfa to your computer and use it in GitHub Desktop.
アセンブリのトランスレートをまとめてチェックするシェルスクリプト
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
OUTFILE='list' | |
CODE=('mov') | |
SRC=('r0' 'r1' 'r2' 'r3' 'r4' 'r5' 'sp' \ | |
'(r0)' '(r1)' '(r2)' '(r3)' '(r4)' '(r5)' '(sp)' \ | |
'(r0)+' '(r1)+' '(r2)+' '(r3)+' '(r4)+' '(r5)+' '(sp)+' \ | |
'-(r0)' '-(r1)' '-(r2)' '-(r3)' '-(r4)' '-(r5)' '-(sp)' \ | |
'2(r0)' '3(r1)' '1(r2)' '-1(r3)' '0(r4)' '-2(r5)' '-1(sp)' \ | |
'*(r0)' '*(r1)' '*(r2)' '*(r3)' '*(r4)' '*(r5)' '*(sp)' \ | |
'*(r0)+' '*(r1)+' '*(r2)+' '*(r3)+' '*(r4)+' '*(r5)+' '*(sp)+' \ | |
'*(r0)' '*(r1)' '*(r2)' '*(r3)' '*(r4)' '*(r5)' '*(sp)' \ | |
'*2(r0)' '*3(r1)' '*1(r2)' '*-1(r3)' '*0(r4)' '*-2(r5)' '*-1(sp)' \ | |
'p' 'p+4' '$p+8' '$-2.' '$222' '*pp' '*pp+2' '*$p+4') | |
DEST=('r0' 'r1' 'r2' 'r3' 'r4' 'r5' \ | |
'(r0)' '(r1)' '(r2)' '(r3)' '(r4)' '(r5)' '(sp)' \ | |
'(r0)+' '(r1)+' '(r2)+' '(r3)+' '(r4)+' '(r5)+' '(sp)+' \ | |
'-(r0)' '-(r1)' '-(r2)' '-(r3)' '-(r4)' '-(r5)' '-(sp)' \ | |
'2(r0)' '3(r1)' '1(r2)' '-1(r3)' '0(r4)' '-2(r5)' '-1(sp)' \ | |
'*(r0)' '*(r1)' '*(r2)' '*(r3)' '*(r4)' '*(r5)' '*(sp)' \ | |
'*(r0)+' '*(r1)+' '*(r2)+' '*(r3)+' '*(r4)+' '*(r5)+' '*(sp)+' \ | |
'*(r0)' '*(r1)' '*(r2)' '*(r3)' '*(r4)' '*(r5)' '*(sp)' \ | |
'*2(r0)' '*3(r1)' '*1(r2)' '*-1(r3)' '*0(r4)' '*-2(r5)' '*-1(sp)' \ | |
'p' 'p+4' '*pp' '*pp+2' '*$p+4') | |
:>$OUTFILE | |
for c in "${CODE[@]}" ; do | |
for s in "${SRC[@]}" ; do | |
for d in "${DEST[@]}" ; do | |
echo $c $s, $d >> $OUTFILE | |
done | |
done | |
done |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
######################################################## | |
# 指定ファイルに記述されている UnixV6: PDP-11 アセンブリを | |
# 一行ずつ ACK: 8086 アセンブリに変換して、 | |
# 両者のアセンブル後のインタプリタでの実行結果を比較する | |
######################################################## | |
# 失敗時のアセンブリをファイル出力する | |
SAVE_ERRLOG="TRUE" | |
# フラグの比較をする | |
FLAG_CHECK="FALSE" | |
TRANSLATER="$HOME/ikebin/p11trans/bin/Release/p11trans.exe -i" | |
V6AS='v6as' | |
I86AS='8086v6-cc -.o' | |
RUN7='7run -m' | |
TEMP="test.s" | |
ERRLOG="error.log" | |
if [ $SAVE_ERRLOG = "TRUE" ]; then | |
: > $ERRLOG | |
fi | |
# フッター | |
V6FOOT=';END: | |
mov p, r0; mov p+2, r1; mov p+4, r2; mov p+6, r3; mov p+8, r4; mov p+10., r5; PMEM: | |
mov pp, r0; mov pp+2, r1; mov pp+4, r2; mov pp+6, r3; mov pp+8, r4; mov pp+10., r5; PPMEM: | |
mov (sp)+, r0 ;mov (sp)+, r1; mov (sp), r2; STACK: | |
sys exit; | |
. = 400^.; | |
p: 10020; 42; 40100; 252; 0; 104210; 1;1;1;1; | |
pp: p; p+2; p+4; p+6; p+10; p+12; p+14; p+16; p+20; p+22' | |
I86FOOT=';END: | |
mov ax, p; mov dx, p+2; mov cx, p+4; mov si, p+6; mov di, p+8; mov bp, p+10; PMEM: | |
mov ax, pp; mov dx, pp+2; mov cx, pp+4; mov si, pp+6; mov di, pp+8; mov bp, pp+10; PPMEM: | |
pop ax; pop dx; mov bx, sp; mov cx, (bx); STACK: | |
int 7; .data1 1; | |
.align 0x100; | |
p: .data2 0x1010, 0x22, 0x4040, 0xaa, 0, 0x8888,1,1,1,1; | |
pp: .data2 p, p+2, p+4, p+6, p+8, p+012, p+014, p+016, p+020, p+022; | |
tmpMem: .data2 0' | |
# カウンタ | |
NTRANS=0 | |
NOK=0 | |
NNG=0 | |
# 失敗ログ | |
NGLOG=() | |
WARNLOG=() | |
# a.outの作成時間を得る | |
AoutTime() { | |
if [ -f "a.out" ]; then | |
echo `ls --full-time a.out | awk '{print $7}'` | |
else | |
echo "" | |
fi | |
} | |
# ヘッダを作成する | |
MakeHead() { | |
OUT="" | |
P=('$p+4' '$p+6' '$p+10' '$p+12' '$p+4' '$p+6' '$p+10') | |
PP=('$pp+4' '$pp+6' '$pp+10' '$pp+12' '$pp+4' '$pp+6' '$pp+10') | |
VAL=('$3407' '$100200' '$10421' '$0' '$040' '$177776' '$4631') | |
DELIM=" ," | |
# レジスタ初期値 | |
for i in `seq 0 5`; do | |
if echo $@ | grep -q "[$DELIM]\*[^$DELIM]*(r$i)"; then | |
OUT=$OUT"mov ${PP[$i]}, r$i; " | |
elif echo $@ | grep -q "[$DELIM][^\*$DELIM]*(r$i)"; then | |
OUT=$OUT"mov ${P[$i]}, r$i; " | |
elif echo $@ | grep -q "[$DELIM][^\*($DELIM]*r$i"; then | |
OUT=$OUT"mov ${VAL[$i]}, r$i; " | |
fi | |
done | |
# スタック初期値 | |
if echo $@ | grep -q "[$DELIM]\*[^$DELIM]*(sp)"; then | |
OUT=$OUT'mov $p, 177762; mov $p+2, 177764; mov $p+4, 177766; | |
mov $p+6, 177770; mov $p+10, 177772; mov $p+12, 177774; mov $p+14, 177776; ' | |
else | |
OUT=$OUT'mov $pp, 177762; mov $pp+2, 177764; mov $pp+4, 177766; | |
mov $pp+6, 177770; mov $pp+010, 177772; mov $pp+012, 177774; mov $pp+014, 177776; ' | |
fi | |
echo $OUT | |
} | |
# 引数のチェック | |
if [ $# -ne 1 ]; then | |
echo "Usage: $0 instructionListFile" 1>&2 | |
exit 1 | |
fi | |
if [ ! -f $1 ]; then | |
echo "$1 is not exist" 1>&2 | |
exit 1 | |
fi | |
# 1行処理のループ | |
while read LINE; do | |
if [ -z "$LINE" ]; then | |
continue | |
fi | |
NTRANS=`expr $NTRANS + 1` | |
HEAD=`MakeHead $LINE` | |
PRE_AOUT_TIME=`AoutTime` | |
# V6 as | |
echo $HEAD$LINE$V6FOOT | $V6AS '/proc/self/fd/0' | |
if [ ! -f "a.out" -o "`AoutTime`" = "$PRE_AOUT_TIME" ]; then | |
# アセンブル失敗 | |
NGLOG+=("$LINE : V6 as error") | |
NNG=`expr $NNG + 1` | |
if [ $SAVE_ERRLOG = "TRUE" ]; then | |
echo $HEAD$LINE$V6FOOT >> $ERRLOG | |
fi | |
continue | |
fi | |
# PDP11 インタプリタ実行結果を取得 | |
PDP11Result=(`\ | |
$RUN7 a.out 2>&1 |\ | |
awk '/^END/{getline; print $1","$2","$3","$4","$5","$6","$7,$8} | |
/^PMEM/{getline; print $1","$2","$3","$4","$5","$6} | |
/^PPMEM/{getline; print $1","$2","$3","$4","$5","$6} | |
/^STACK/{getline; print $1","$2","$3}'`) | |
# translate | |
$TRANSLATER $HEAD$LINE > $TEMP | |
if [ $? -ne 0 ]; then | |
# トランスレート失敗 | |
NGLOG+=("$LINE : translate error") | |
NNG=`expr $NNG + 1` | |
if [ $SAVE_ERRLOG = "TRUE" ]; then | |
echo $HEAD$LINE >> $ERRLOG | |
fi | |
continue | |
fi | |
echo $I86FOOT >> $TEMP | |
PRE_AOUT_TIME=`AoutTime` | |
# i86 as | |
$I86AS $TEMP | |
if [ ! -f "a.out" -o "`AoutTime`" = "$PRE_AOUT_TIME" ]; then | |
# アセンブル失敗 | |
NGLOG+=("$LINE : i86 as error") | |
NNG=`expr $NNG + 1` | |
cat $TEMP >> $ERRLOG | |
continue | |
fi | |
# 8086 インタプリタ実行結果を取得 | |
I86Result=(`\ | |
$RUN7 a.out 2>&1 |\ | |
awk '/^END/{getline; print $1","$4","$3","$7","$8","$6","$5,$9} | |
/^PMEM/{getline; print $1","$4","$3","$7","$8","$6} | |
/^PPMEM/{getline; print $1","$4","$3","$7","$8","$6} | |
/^STACK/{getline; print $1","$4","$3}'`) | |
I86Result[1]=`echo ${I86Result[1]} | \ | |
tr ZSCO ZNCV | \ | |
sed -e 's/^\(.\)\(.\)\(.\)\(.\)/\3\2\4\1/'` | |
# 結果の比較 | |
RESULT="-" | |
if [ ${PDP11Result[0]} != ${I86Result[0]} ]; then | |
NGLOG+=("$LINE") | |
NGLOG+=(" (r0 , r1 , r2 , r3 , r4 , r5 , sp)") | |
NGLOG+=(" pdp11: ${PDP11Result[0]}") | |
NGLOG+=(" 8086 : ${I86Result[0]}") | |
RESULT="NG" | |
elif [ ${PDP11Result[2]} != ${I86Result[2]} ]; then | |
NGLOG+=("$LINE") | |
NGLOG+=(" ( p , p+2, p+4, p+6, p+8, p+a)") | |
NGLOG+=(" pdp11: ${PDP11Result[2]}") | |
NGLOG+=(" 8086 : ${I86Result[2]}") | |
RESULT="NG" | |
elif [ ${PDP11Result[3]} != ${I86Result[3]} ]; then | |
NGLOG+=("$LINE") | |
NGLOG+=(" (pp ,pp+2,pp+4,pp+6,pp+8,pp+a)") | |
NGLOG+=(" pdp11: ${PDP11Result[3]}") | |
NGLOG+=(" 8086 : ${I86Result[3]}") | |
RESULT="NG" | |
elif [ ${PDP11Result[4]} != ${I86Result[4]} ]; then | |
NGLOG+=("$LINE") | |
NGLOG+=(" (sp ,sp+2,sp+4)") | |
NGLOG+=(" pdp11: ${PDP11Result[4]}") | |
NGLOG+=(" 8086 : ${I86Result[4]}") | |
RESULT="NG" | |
fi | |
if [ $RESULT = "NG" ]; then | |
# 結果が違った場合 (レジスタ値、メモリ値) | |
NNG=`expr $NNG + 1` | |
if [ $SAVE_ERRLOG = "TRUE" ]; then | |
echo $HEAD$LINE$V6FOOT >> $ERRLOG | |
cat $TEMP >> $ERRLOG | |
echo "" >> $ERRLOG | |
fi | |
continue | |
elif [ $FLAG_CHECK = "TRUE" -a ${PDP11Result[1]} != ${I86Result[1]} ]; then | |
# フラグが違った場合 | |
WARNLOG+=("$LINE") | |
WARNLOG+=(" (ZNCV)") | |
WARNLOG+=(" pdp11 Flag: ${PDP11Result[1]}") | |
WARNLOG+=(" 8086 Flag: ${I86Result[1]}") | |
fi | |
NOK=`expr $NOK + 1` | |
done < $1 | |
rm $TEMP | |
rm a.out | |
echo "*************************************************" | |
echo "Total: $NTRANS, OK: $NOK, NG: $NNG" | |
if [ $NNG != 0 ]; then | |
echo "ERROR" | |
for log in "${NGLOG[@]}"; do | |
echo " $log" | |
done | |
fi | |
if [ ${#WARNLOG[*]} != 0 ]; then | |
echo "WARNING" | |
for log in "${WARNLOG[@]}"; do | |
echo " $log" | |
done | |
fi | |
echo "*************************************************" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment