diff --git a/example-os/.gitignore b/example-os/.gitignore index bf41a39..96a543c 100644 --- a/example-os/.gitignore +++ b/example-os/.gitignore @@ -1,4 +1,5 @@ /os.sh /os.ndisasm.disasm /os.reasm.asm -/os.reasm \ No newline at end of file +/os.reasm +/os.reasm.disasm \ No newline at end of file diff --git a/example-os/Makefile b/example-os/Makefile index 5b4e11c..097a82a 100644 --- a/example-os/Makefile +++ b/example-os/Makefile @@ -9,14 +9,7 @@ os.sh: os.asm ../deploy-screenshots Makefile chmod a+x $@ os.ndisasm.disasm: os.sh Makefile - (echo "[BITS 16]"; \ - echo "[ORG 0x7c00]"; \ - ndisasm -o 0x7C00 $< \ - | uniq -s 8 -c \ - | sed -r -e 's/\s*1 //; t; s/\s*([0-9]+) ([^ ]+\s+[^ ]+\s+)/\2times \1 /' \ - | sed -r -e 's/([^ ]+\s+[0-9A-F]{4}\s+jz) 0x/\1 short 0x/') > $@ -# The last sed line just above fixes an issue with ndisasm -# (it fails to annotate the jz with short). + ../utils/compact-ndisasm.sh $< $@ os.reasm.asm: os.ndisasm.disasm Makefile sed -r -e 's/^[^ ]+ +[^ ]+ +//' $< > $@ @@ -26,7 +19,9 @@ os.reasm: os.reasm.asm os.sh Makefile @echo "diff $@ os.sh" @diff $@ os.sh \ && echo "Re-assembled file is identical to os.sh" \ - || (echo "Re-assembled file is different from os.sh"; exit 1) + || (../utils/compact-ndisasm.sh $@ os.reasm.disasm; \ + echo "Re-assembled file is different from os.sh. Use meld os.ndisasm.disasm os.reasm.disasm to see differences."; \ + exit 1) .PHONY: clean Makefile clean: diff --git a/utils/compact-ndisasm.sh b/utils/compact-ndisasm.sh new file mode 100755 index 0000000..dcb52e4 --- /dev/null +++ b/utils/compact-ndisasm.sh @@ -0,0 +1,16 @@ +in=$1 +out=$2 + +# Add -s 0x1234 to te ndisasm command-line to specify that there is an +# instruction starting at 0x1234. Use this when ndisasm misinterprets +# some instructions due to db. +skip="" +for i in `seq 0 255`; do skip="$skip -s 0x7e$(printf %02x $i)"; done +(echo "[BITS 16]"; \ + echo "[ORG 0x7c00]"; \ + ndisasm -s 0x7c78 $skip -o 0x7C00 "$in" \ + | uniq -s 8 -c \ + | sed -r -e 's/^\s*1 //; t; s/^\s*([0-9]+) ([^ ]+\s+[^ ]+\s+)/\2times \1 /' \ + | sed -r -e 's/([^ ]+\s+[0-9A-F]{4}\s+j[^ ]+ )0x/\1short 0x/') > "$out" +# The last sed line just above fixes an issue with ndisasm +# (it fails to annotate jz and jnc (and possibly other) with short).