diff --git a/example-os/.gitignore b/example-os/.gitignore index 809de46..bf41a39 100644 --- a/example-os/.gitignore +++ b/example-os/.gitignore @@ -1 +1,4 @@ -/os.sh \ No newline at end of file +/os.sh +/os.ndisasm.disasm +/os.reasm.asm +/os.reasm \ No newline at end of file diff --git a/example-os/Makefile b/example-os/Makefile index 6c503a6..7a1a2a3 100644 --- a/example-os/Makefile +++ b/example-os/Makefile @@ -1,5 +1,5 @@ .PHONY: all -all: os.sh +all: os.sh os.ndisasm.disasm os.reasm.asm os.reasm ../deploy-screenshots: mkdir $@ @@ -8,6 +8,28 @@ os.sh: os.asm ../deploy-screenshots Makefile nasm -o $@ $< chmod a+x $@ +os.ndisasm.disasm: os.sh Makefile + ndisasm $< \ + | 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). + +os.reasm.asm: os.ndisasm.disasm Makefile + sed -r -e 's/^[^ ]+ +[^ ]+ +//' $< > $@ + +os.reasm: os.reasm.asm os.sh Makefile + nasm $< -o $@ + @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) + +.PHONY: clean Makefile +clean: + rm -f os.sh os.ndisasm.disasm os.reasm.asm os.reasm + .PHONY: test test: test-qemu-system-i386 test-qemu-system-arm test-virtualbox test-bochs Makefile