Skip to content

Instantly share code, notes, and snippets.

@kusabanachi
Created December 7, 2014 01:57
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kusabanachi/d0247c6495497c296bfa to your computer and use it in GitHub Desktop.
Save kusabanachi/d0247c6495497c296bfa to your computer and use it in GitHub Desktop.
アセンブリのトランスレートをまとめてチェックするシェルスクリプト
#!/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
#!/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